Tag: executor

Java执行器和每线程(不是每个工作单元)对象?

我的任务将受益于线程池设计模式(许多小任务要并行执行)。 我最初从头开始实现一个天真的线程池,n个Runnables都从同一个ConcurrentLinkedQueue拉出工作单元,直到队列为空,然后终止。 然后我决定“嘿,让我们尝试Java中的Executor,因为这可能比我天真设计的系统更好地测试和更可靠。” 问题:在我的实现中,每个线程持续到队列为空,使用while (!queue.isEmpty()) ,并获得自己的非线程安全对象实例,让我们称之为SlowObject foo ,这很耗时构建。 尝试传递进入Executor池的所有Runnable ,时间效率低的对象的实例失败,因为它不是线程安全的。 为每个Runnable创建SlowObject的新实例是不可取的,因为它们构造成本SlowObject 。 有没有办法说“我们使用了多少线程?让我们为每个线程创建一个SlowObject ,然后让Runnables检测我们所在的线程并查找要使用的正确对象?” 这听起来很脆弱且容易出错 – 但不确定我应该看哪种设计模式。

等待Executor中的所有线程完成?

我正在实现一个parellel quicksort作为编程实践,在我完成之后,我阅读了Executors上的Java教程页面,听起来他们可以让我的代码更快。 不幸的是,我依靠join()来确保程序不会继续,直到所有内容都被排序。 现在我正在使用: public static void quicksort(double[] a, int left, int right) { if (right <= left) return; int i = partition(a, left, right); // threads is an AtomicInteger I'm using to make sure I don't // spawn a billion threads. if(threads.get() < 5){ // ThreadSort's run method just calls quicksort() Future leftThread = […]

删除ThreadPoolExecutor的所有排队任务

我有关于ThreadPoolExecutor的这个相当简单的问题。 我有以下情况:我必须从队列中使用对象,为它们创建适当的工作任务并将它们提交给ThreadPoolExecutor。 这很简单。 但在关闭情况下, 许多工作人员可能会排队等待执行。 由于其中一个任务可能运行了一个小时,并且我想要相对快速地正常关闭应用程序,我想从ThreadPoolExecutor中丢弃所有排队的任务,而已经处理的任务应该正常完成。 ThreadPoolExecutor文档有一个remove()方法,但只允许删除特定的任务。 purge()仅适用于已取消的Future任务。 我的想法是清除队列中包含所有排队的任务。 ThreadPoolExecutor提供对此内部队列的访问,但文档指出: 方法getQueue()允许访问工作队列以进行监视和调试。 强烈建议不要将此方法用于任何其他目的。 所以抓住这个队列并清除它不是一个选择。 此外,该文档的片段说: 当大量排队的任务被取消时,两个提供的方法remove(java.lang.Runnable)和purge()可用于协助存储回收。 怎么样? 当然,我可以维护我提交给执行程序的所有任务的列表,在关闭的情况下,我遍历所有条目并使用remove()方法从ThreadPoolExecutor中删除它们……但是…来吧,这是一个浪费记忆力和维护这份清单的麻烦。 (例如删除已执行的任务) 我感谢任何提示或解决方案!

如何使用ThreadPoolExecutor和自定义任务实现PriorityBlockingQueue

我经常搜索,但找不到解决问题的方法。 我有自己的类BaseTask ,它使用ThreadPoolExecutor来处理任务。 如果我不想要优先级(即使用LinkedBlockingQueue ),这可以正常工作,但是当我尝试使用PriorityBlockingQueue我得到ClassCastException因为ThreadPoolExecutor将我的Tasks包装到FutureTask对象中。 这显然是可以的,因为FutureTask没有实现Comparable ,但我将如何继续解决优先级问题? 我已经读过你可以在ThreadPoolExecutor覆盖newTaskFor ,但我似乎根本找不到这个方法……? 我们欢迎所有的建议! 一些代码可以帮助: 在我的BaseTask课程中,我有 private static final BlockingQueue sWorkQueue = new PriorityBlockingQueue(); private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, “AsyncTask #” + mCount.getAndIncrement()); } }; private static final BaseThreadPoolExecutor sExecutor […]