我使用Java框架同时执行多个线程。在执行完所有线程之后,我想做一些操作。执行器框架中是否有侦听器或事件捕获机制?
发布于 2015-04-22 09:35:32
您可以考虑从ThreadPoolExecutor迁移到ScheduledThreadPoolExecutor。不同的是,对于所有排队的任务,您将得到一个Future。
这允许您检查提交的任务的.isDone()并相应地采取行动。特别有趣的是,如果您需要使用您提交的内容的结果,那么您可以干净地执行.get(),而不会阻塞调用线程,直到执行完成为止。
另一种选择可能是实现ThreadFactory,它生成一个额外的侦听器线程以join()主线程,并在完成时通知您。
发布于 2015-04-22 09:23:37
ThreadPoolExecutor的API接口描述了一些可能对此有用的钩子:
钩法 该类提供了在执行每个任务之前和之后调用的受保护的overridable beforeExecute(java.lang.Thread,java.lang.Runnable)和afterExecute(java.lang.Runnable,java.lang.Throwable)方法。这些工具可用于操作执行环境;例如,重新初始化ThreadLocals、收集统计信息或添加日志条目。此外,可以重写any ()方法,以执行执行程序完全终止后需要执行的任何特殊处理。 如果钩子或回调方法引发异常,内部工作线程可能会失败并突然终止。
请参阅https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
发布于 2015-04-22 09:23:38
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类编写守护进程类,并生成线程,它将充当侦听器。
在这种情况下,您可以通过使用上面的守护进程类来实现您想要实现的任何目标。
https://stackoverflow.com/questions/29792990
复制相似问题