使用Java Executor框架同时执行多个线程。我想在所有线程执行完毕后再做一些操作。难道我们在执行框架的任何听众或事件捕获机制在Executor框架中执行所有线程时捕获事件
为ThreadPoolExecutor的
1
A
回答
2
您可能会考虑从ThreadPoolExecutor
移动到ScheduledThreadPoolExecutor
。不同的是,对于你入队的所有任务,你会得到一个Future<T>
。
这使您可以检查您提交的任务.isDone()
并采取相应的行动。如果您需要使用您提交的结果,尤其有趣,因为您可以干净地执行.get()
,然后在执行完成之前不阻止调用线程。
另一种替代方案可能是实现一个ThreadFactory
,它会产生一个额外的监听线程到join()
主线程并在完成时通知您。
3
的API码头描述了一些挂钩,可能这个是有用的:
挂钩方法
这个类提供保护重写beforeExecute( java.lang.Thread,java.lang.Runnable)和 afterExecute(java.lang.Runnable,java.lang.Throwable)方法,这些方法在执行每个任务之前和之后都会调用 。这些可以用来操纵执行环境;例如,重新初始化ThreadLocals,收集统计信息或添加日志条目。 此外,可以覆盖方法终止()以执行任何 特殊处理,在执行程序完全终止 后需要完成该处理。
如果挂钩或回调方法抛出异常,内部工作者线程可能会失败并突然终止。
见https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
1
A a = new A();
B b= new B();
FutureTask fa = new FutureTask (a);
FutureTask fb = new FutureTask (b);
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit (fa);
es.submit(fb);
String getName = (String)a.get();
String getSurName = (String)b.get();
es.shutdown();
***//Here all threads are executed and
//you can write any code which you want to execute after
//finishing all the threads.***
或者其他的解决办法。 .... 您可以使用LocalThrad
类编写守护进程类并生成线程,它将充当您的侦听器。
无论你想在这种情况下实现,你可以通过使用上面的守护进程类来实现。
相关问题
- 1. Aspectj没有捕获到Spring框架中的所有事件?
- 2. ThreadPoolTaskExecutor未执行提交给它的所有线程
- 3. 如何捕获在iframe上执行的所有事件?
- 4. socket.io - 捕获所有事件
- 5. 捕获所有事件(javascript)
- 6. 使用Executor框架在Weblogic SOAP Webservice中创建后台线程
- 7. 捕获从子框架到父框架的点击事件
- 8. 在iFrame中嵌套的框架中捕获滚动事件
- 9. 如何在执行多个线程时立即捕获错误?
- 10. 捕获时间框架
- 11. Android线程 - 在执行所有其他线程之前执行一个线程
- 12. 捕获并行线程的总执行时间
- 13. 从所有线程捕获异常?
- 14. 捕获.Net线程结束事件
- 15. 如何在执行onblur时“捕获”并卸载事件
- 16. 事件在当前线程或新线程中执行
- 17. 捕获所有滚动事件
- 18. Backgrid捕获选择所有事件
- 19. ExtJS的 - 捕获所有事件
- 20. jQuery click()事件捕获所有?
- 21. 列出ThreadPoolTaskExecutor中的所有正在运行/排队的线程
- 22. 远程执行DTSX文件(SSIS包)并捕获事件
- 23. 当在线程中运行时TestLink执行更新不适用于鼻框架
- 24. 在SQL Server中捕获执行流程
- 25. 等待Executor中的所有线程完成?
- 26. Executor服务线程
- 27. 绘制边框所有元素,但不捕获事件
- 28. 捕获所有文本框的焦点事件 - jQuery
- 29. Java执行程序框架中的终止线程控制
- 30. 如何让wxpython在单元测试中捕获线程事件?
是的,使用'ScheduledThreadPoolExecutor'可能是最好的/最干净的方法 –