不使用Thread.join()的原因

时间:2013-05-13 01:30:39

标签: java multithreading

最近,高级开发人员告诉我不要使用Thread.join()等待另一个Thread完成。我也看到过几个这样的问题,要求候补人员加入。

在我的研究中,我找不到join()的任何错误。事实上它被广泛使用。

所以我想知道为什么不使用join()?这有什么问题?它会促进糟糕的编程或架构吗?

4 个答案:

答案 0 :(得分:33)

join()没有错。它一样好。

但是,这就是为什么你不应该构建你的应用程序来依赖连接。在Java中,运行任务的主要抽象不再是Thread。它是Executor。也就是说,您将并发任务包装为Callable,只需将其提交给Executor,而无需担心执行细节。这就是Executor的工作方式。您分别submitexecute CallableRunnable,无需指定主题。

  

所以我想知道为什么不使用join()?

然后这就是你的理由:既然你没有在Executor世界中创建或操纵线程,那么使用join是没有意义的。几乎每个join都可以替换为其他内容(Future.getCountDownLatchLocks等。)


注意:我并不是说在使用Executors时你不需要操作Threads。在某些情况下,最好创建自己的Thread子类,然后让Executor通过ThreadFactory使用它们。

答案 1 :(得分:11)

一般情况下使用Thread.join没有任何问题,但是你需要非常小心并且知道线程来自哪里。如果它来自线程池 - 那么你确实遇到了麻烦,因为这样的线程一直在运行,直到池被终止并在几个工作者之间共享。

答案 2 :(得分:1)

IMO加入没有任何问题。您只需要注意确保您正在等待的线程在所有情况下都会终止。因为如果没有,则执行可能永远停止。 因此,如果您使用连接使主线程在某个线程上等待并且线程未终止,则可能导致整个应用程序冻结。

答案 3 :(得分:1)

在Java 7中引入了Fork/Join框架。考虑使用它而不是Thread.join()。通常,您应该尽可能使用包java.util.concurrent。*中的类,尽量减少对同步块,等待/通知和连接等原始同步技术的使用。 java.util.concurrent提供了更大的灵活性。