Multithreading 当Thread join()违背了线程并发的唯一目的时,它为什么有用

Multithreading 当Thread join()违背了线程并发的唯一目的时,它为什么有用,multithreading,Multithreading,既然线程连接导致逻辑的顺序执行,那么首先在多个线程之间划分任务的动机是什么?换句话说,我无法想象实际需要线程连接的真实场景。如果要启动多个线程,可以使用join(),然后等待所有线程都完成 例如,启动5个工作项,每个工作项在各自的线程中,然后在5个线程上调用join(),这将允许您同时处理所有5个工作项,但会一直阻止,直到它们全部完成 但是,请注意,许多语言/框架都有比显式加入线程更好的选择。例如,在.NET世界中,TPL允许您计划在一个或多个任务(如果需要,可以映射到线程)全部完成时发生的连续

既然线程连接导致逻辑的顺序执行,那么首先在多个线程之间划分任务的动机是什么?换句话说,我无法想象实际需要线程连接的真实场景。

如果要启动多个线程,可以使用
join()
,然后等待所有线程都完成

例如,启动5个工作项,每个工作项在各自的线程中,然后在5个线程上调用
join()
,这将允许您同时处理所有5个工作项,但会一直阻止,直到它们全部完成


但是,请注意,许多语言/框架都有比显式加入线程更好的选择。例如,在.NET世界中,TPL允许您计划在一个或多个任务(如果需要,可以映射到线程)全部完成时发生的连续性。

在某些情况下,您可能会将类似的任务分发给一组线程,但您需要完成所有任务才能获得您正在寻找的“答案”


例如,如果你正在进行一场国际象棋游戏,你可以将可能的一组动作分配给各个线程,然后等到它们全部完成后再选择“最好的”一个。

有时你希望同时发生一系列事情,当它们全部完成时,你希望将它们的所有结果结合起来并向前移动


例如,web门户主页需要为服务器端的一组独立小部件加载数据。您可以并行启动这些数据加载,然后在呈现整个页面之前让主线程连接这些数据加载(即等待它们完成)。

这没有用,因为它比人类已知的任何其他线程间通信机制都有更多的缺点。它积极鼓励糟糕的多线程设计,这极有可能增加开销并防止进程关闭,特别是在GUI应用程序中


如果可以避免使用它,请这样做。

+1
thread.join()
的另一个重要功能是内存同步。调用
join()
的线程成功后,如果我知道更多的线程包,就会看到它所加入的线程所做的内存更新。我也不知道。Join()是一种持续创建/终止/销毁线程的邀请,而不是使用线程池和应用生命周期线程,因此在创建等方面浪费时间/CPU。开销。Join()还适用于关闭时死锁GUI应用程序,从而防止进程终止。可能是目前最糟糕的线程间通信机制。我投了反对票,因为我在Jetty中看到了使用join()的非常合理的代码,这是一个相当复杂的应用程序。它在关机期间用于等待线程池中的线程完成。现在在java.util.concurrent中有更好的选项,但是如果您想支持旧版本的java,这是没有用的。我花了大约30年的时间试图阻止开发人员在各种语言中使用Join()、TThread.WaitFor等。我的观点仍然是一样的,不是试图说服你(事实上,我同意几乎总是有更好的选择)。只是解释否决票。