2015-04-22 31 views

回答

2

您可能会考虑从ThreadPoolExecutor移动到ScheduledThreadPoolExecutor。不同的是,对于你入队的所有任务,你会得到一个Future<T>

这使您可以检查您提交的任务.isDone()并采取相应的行动。如果您需要使用您提交的结果,尤其有趣,因为您可以干净地执行.get(),然后在执行完成之前不阻止调用线程。

另一种替代方案可能是实现一个ThreadFactory,它会产生一个额外的监听线程到join()主线程并在完成时通知您。

+0

是的,使用'ScheduledThreadPoolExecutor'可能是最好的/最干净的方法 –

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类编写守护进程类并生成线程,它将充当您的侦听器。

无论你想在这种情况下实现,你可以通过使用上面的守护进程类来实现。

相关问题