繁体   English   中英

不使用Thread.join()的原因

[英]Reasons for not using Thread.join()

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

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

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

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

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

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

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


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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM