对于已通过ThreadPoolExecutor执行的线程是否有类似join()的方法?
如果我向执行程序提交一些Callables并在他们返回的Futures上使用get()方法,我是否会获得与Thread.join()类似的行为?
答案 0 :(得分:4)
它们在{(1}}和Thread#join()
都将阻塞直到线程/ cllable完成之前是相似的。在Future#get()
的情况下,调用在线程死亡时返回。没有返回结果。在Thread#join()
的情况下,它将在可调用执行完任务时返回,但执行的线程不会死(它通常是线程池的一部分,所以它会使自己可以返回池中)。 / p>
如果您提交给ExecuterService的这些任务是关键任务的,那么最好在应用程序中添加一个关闭钩子,调用Future#get()
以允许正常完成所有正在运行的线程,并等待threadPool.shutdown()
成为真,或等待threadPool.isTerminated()
返回。
答案 1 :(得分:1)
如果是“相似”,则表示当前线程将阻塞,直到工作完成,然后是。区别在于Thread.join()会阻塞,直到有问题的线程死掉。 Future.get()仅阻塞你submitted完成执行的Callable或Runnable。