Jos*_*chi 5 java multithreading
如果我有以下代码,哪个工作正常:
ExecutorService service = Executors.newFixedThreadPool(100);
[....]
List<Future<SomeObject>> futures = service.invokeAll(callables);
for (Future f : futures) {
f.get();
}
// shutdown the service after all Callables are finished.
service.shutdown();
boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS);
if (serviceIsShutDown) {
System.out.println("Service terminated normally. All ok.");
} else {
// What if it's not shutDown?
[...]
// this?
//service = null;
}
Run Code Online (Sandbox Code Playgroud)
问题:如果通话怎么办?
boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
因超时命中而返回false?
我猜ExecutorService中的Threads将保持WAIT状态.什么是最好的解决方案?将服务设置为null并让GarbageCollector删除它?但相关的线程会发生什么?它是否会被垃圾收集,因为仍然有参考?
代码通常有效,但只是好奇.如果返回false该怎么办?
如果在您的示例中awaitTermination()返回false,您可以选择尝试调用shutdownNow(). 此方法将尽力取消所有仍在执行的任务,但它不保证任何结果。一些执行不力的任务可能没有取消策略并且永远运行。在这种情况下,线程永远不会终止,执行器也永远不会被垃圾收集。
此类任务还会阻止您的程序正常终止(如果您不将工作线程标记为守护进程)。
例如,如果您的任务仅包含一个空的无限循环,即使您调用 ,它也不会被取消shutdownNow()。
还可能存在这样的情况:任务没有适当的取消策略,并且运行时间太长(但不是永远)。例如,它有一个非常非常长的空循环。您可能无法通过shutdown()/关闭正在执行此类任务的池shutdownNow(),但迟早它会完成其工作,并且线程将与执行器一起终止。
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |