使用 ExecutorService 等待线程完成
当使用 ExecutorService 并发执行多个任务时,有效处理完成通知变得至关重要。本文探讨了等待所有线程完成而不依赖无限循环的最佳方法。
如问题中所述,无限循环不被认为是最佳解决方案。相反,ExecutorService 提供了一个内置机制来管理任务完成:shutdown() 和awaitTermination() 方法。
使用 shutdown() 和awaitTermination()
ExecutorService接口提供了shutdown()方法,该方法通知ExecutorService不再接受新任务。一旦所有当前提交的任务完成,ExecutorService 将终止。
为了等待任务完成,使用了awaitTermination() 方法。该方法有两个参数:
在问题提供的示例中,代码可以修改如下:
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } taskExecutor.shutdown(); try { taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { ... }
Long.MAX_VALUE 超时可确保awaitTermination() 方法阻塞,直到所有任务完成。如果任务完成对时间敏感,可以指定有限的超时。
结论
利用 shutdown() 和awaitTermination() 方法提供了一种可靠且高效的方法等待所有线程完成而不诉诸无限循环。这种方法简化了任务管理并确保线程以受控方式完成。
以上是如何高效等待ExecutorService线程完成而不出现无限循环?的详细内容。更多信息请关注PHP中文网其他相关文章!