Tag: executorservice

删除ThreadPoolExecutor的所有排队任务

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

Java ExecutorService暂停/恢复特定线程

有没有办法使用ExecutorService来暂停/恢复特定的线程? private static ExecutorService threadpool = Executors.newFixedThreadPool(5); 想象一下,我想停止线程,因为id = 0(假设为每个线程分配一个增量id,直到达到线程池的大小)。 过了一会儿,按一个按钮让我们说,我想恢复那个特定的线程,并让所有其他线程保持其当前状态,可以暂停或恢复。 我在Java文档中找到了一个未完成的PausableThreadPoolExecutor版本。 但它不适合我需要的东西,因为它恢复了池中的所有线程。 如果没有办法使用ExecutorService的默认实现,那么任何人都可以指出我对这个问题的Java实现吗? 谢谢!

ExecutorService令人惊讶的性能收支平衡点 – 经验法则?

我试图弄清楚如何正确使用Java的Executors。 我意识到向ExecutorService提交任务有其自己的开销。 但是,我很惊讶它看到它的高度。 我的程序需要以尽可能低的延迟处理大量数据(股票市场数据)。 大多数计算都是相当简单的算术运算。 我试着测试一些非常简单的东西:“ Math.random() * Math.random() ” 最简单的测试在一个简单的循环中运行这个计算。 第二个测试在匿名Runnable中进行相同的计算(这应该衡量创建新对象的成本)。 第三个测试将Runnable传递给ExecutorService (这测量引入执行程序的成本)。 我在我的小型笔记本电脑上运行测试(2 cpus,1.5 gig ram): (in milliseconds) simpleCompuation:47 computationWithObjCreation:62 computationWithObjCreationAndExecutors:422 (大约四次运行中,前两个数字最终相等) 请注意,执行程序所花费的时间远远多于在单个线程上执行的时间。 对于1到8之间的线程池大小,数字大致相同。 问题:我是否遗漏了一些明显的或预期的结果? 这些结果告诉我,我传递给执行程序的任何任务都必须进行一些非平凡的计算。 如果我正在处理数百万条消息,并且我需要对每条消息执行非常简单(且便宜)的转换,我仍然可能无法使用执行程序…尝试在多个CPU之间传播计算可能最终会比仅仅更昂贵在一个线程中完成它们。 设计决策变得比我原先想象的要复杂得多。 有什么想法吗? import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ExecServicePerformance { private static int count = 100000; public static void main(String[] args) throws InterruptedException { […]

如何等待一个产生它自己的线程的线程?

我正在尝试测试一个在单独的线程中工作的方法,简化它是这样的: public void methodToTest() { Thread thread = new Thread() { @Override public void run() { Clazz.i = 2; } }; thread.start(); } 在我的unit testing中,我想测试Clazz.i == 2,但我不能这样做,因为我认为断言是在线程更改值之前运行的。 我想使用另一个线程来测试它,然后使用join等待,但它仍然无法正常工作。 SSCCE: @Test public void sscce() throws InterruptedException { Thread thread = new Thread() { @Override public void run() { methodToTest() } }; thread.start(); thread.join(); AssertEquals(2, Clazz.i); } […]

如何在FutureTask中捕获exception

在发现在Java 1.6(和Eclipse Executors.newCachedThreadPool()上的Executors.newCachedThreadPool()运行的FutureTask吞下了Runnable.run()方法中的exception后,我试图找到一种方法来捕获这些exception而不添加throw / catch我所有的Runnable实现。 API建议覆盖FutureTask.setException()应该有助于: 导致此未来报告ExecutionException,并将给定的throwable作为其原因,除非已设置或已取消此Future。 在计算失败时,run方法在内部调用此方法。 但是,似乎没有调用此方法(使用调试器运行显示FutureTask捕获exception,但未setException )。 我写了以下程序来重现我的问题: public class RunTest { public static void main(String[] args) { MyFutureTask t = new MyFutureTask(new Runnable() { @Override public void run() { throw new RuntimeException(“Unchecked exception”); } }); ExecutorService service = Executors.newCachedThreadPool(); service.submit(t); } } public class MyFutureTask extends FutureTask { public MyFutureTask(Runnable r) […]

ExecutorService.invokeAll不支持可运行任务的收集

想通过ExecutorService的 invokeAll(..)方法运行Runnable任务的集合。 但是现在不支持( 仅支持可调用任务的集合 ) 有什么具体的原因吗? 做类似事情的替代方案是什么。

ExecutorService的未来任务并未真正取消

我将Futures从ExecutorService推送到哈希映射中。 之后,我可以在哈希映射中调用取消期货。 虽然结果是正确的,但后来我在Callable过程中命中了断点,好像Future cancel()没有效果。 我认为这可能是两个不同引用的情况(即使引用ID在断点时被列为相同),但是想知道某些专家是否可以插入。这是代码的样子: ExecutorService taskExecutor = Executors.newCachedThreadPool(); Map <String, Future> results = new HashMap <String, Future>(); Future future = taskExecutor.submit(new MyProcessor(uid)); results.put(uid, future); 我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通过调用此方法从外部源取消: public static synchronized boolean cancelThread(String uid) { Future future = results.get(uid); boolean success = false; if (future != null) { success = (future.isDone() ? true : future.cancel(true)); if (success) […]

从ScheduledExecutorService中运行的任务本身中停止定期任务

在ScheduledExecutorService中运行时,是否有一种很好的方法可以阻止任务内部重复任务? 可以说,我有以下任务: Future f = scheduledExecutor.scheduleAtFixedRate(new Runnable() { int count = 0; public void run() { System.out.println(count++); if (count == 10) { // ??? cancel self } } }, 1, 1, TimeUnit.SECONDS); 从外面看,很容易通过f.cancel()取消,但是如何在指定的地方停止重复? (通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f迟到并且变量设置得太晚时有一个潜在的窗口,并且任务本身可能已经运行,在引用中看到null。)

在webapp中正常关闭ExecutorService?

在我的webapp中,我创建了一个使用具有固定大小ThreadPool的ExecutorService的服务。 我在整个应用程序生命周期中重用了相同的ExecutorService 。 private static ExecutorService pool = Executors.newFixedThreadPool(8); 所有都在Tomcat中运行,它在向下发出错误时给出了以下错误: appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak. 我确实意识到我需要在关闭tomcat之前关闭ExecutorService。 Soms SO线程已经谈到了这一点,但我找不到一个干净的方法来处理这个问题。 我是否应该按照Tim-bender的建议使用ShutdownHook来正常关闭线程和执行程序 ? 或者我应该使用CachedThreadPool吗?

使用ExecutorService控制任务执行顺序

我有一个将异步任务委托给线程池的进程。 我需要确保按顺序执行某些任务。 所以举个例子 任务按顺序到达 任务a1,b1,c1,d1,e1,a2,a3,b2,f1 任务可以按任何顺序执行,除非存在自然依赖性,因此必须按顺序处理a1,a2,a3,方法是分配到同一个线程或阻止这些,直到我知道之前的#任务完成为止。 目前它不使用Java Concurrency包,但我正在考虑改变以利用线程管理。 有没有人有类似的解决方案或如何实现这一目标的建议