2011-12-11 30 views
0

我正在使用Java 5的线程执行程序,并运行几个实现接口callable的任务。关闭ThreadPool中的所有任务java 5

的问题,我的任务中环,一旦我想从我的应用我打电话的shutdownNow()方法,这是不好的退出,因为它停止完成工作

所有任务,我有2个任务运行的没有完成,所以即使在关闭我的应用程序之后,2个线程仍然运行。

是否有API可以确保我的所有线程立即停止或我应该实现一些接口或添加停止方法到我的每个线程。

因为接口Callable只有一个方法调用。并没有停止的方法。

回答

1

阅读ExecutorService#shutdownNow()的javadoc:

尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务列表。

除了竭尽全力尝试停止处理主动执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,所以任何不能响应中断的任务都不会终止。

所以,你需要定期检查Thread#isInterrupted()里面的call()你自己。例如,您可以在while循环中执行此操作。

0

如果您需要订购的所有线程停止,那么你应该添加线程代码中一个标志测试:

while(!stop) { 
    // do work 
} 

而当你想退出程序的标志设置为true。不要忘记让它volatile

如果你只是想等待所有的人都在退出程序之前完成,使用方法:

executor.awaitTermination(60, TimeUnit.SECONDS));