为什么我们应该在线程中使用Join?

时间:2011-07-06 09:43:11

标签: java multithreading

我有两个线程T1和T2,两个都有不同的工作,所以我们通常更喜欢通过线程连接来完成这个任务。

但我们可以使用join()完成此操作。我们可以在T1线程中添加T2线程的代码。 这有什么不同?

9 个答案:

答案 0 :(得分:21)

加入一个帖子意味着一个人等待另一个人结束,这样你就可以安全地访问结果,或者在两个人完成工作后继续。

示例:如果您在主线程中启动一个新线程并且两者都做了一些工作,那么您将加入新创建的线程上的主线程,导致主线程等待第二个线程完成。因此,您可以并行完成一些工作,直到您到达联接。

如果将作业拆分为由不同线程执行的两个部分,则可以获得性能提升,如果

  • 线程可以独立运行,即如果它们不依赖于彼此的数据,否则你必须同步哪些成本性能
  • JVM能够并行执行多个线程,即你有一个超线程/多核机器,JVM使用它

答案 1 :(得分:19)

  

通常我们更喜欢通过线程连接完成此任务。

不,我们不。我们通过启动两个线程完成此任务。没有义务使用join()因此没有“应该”使用它。如果要在另一个线程完成时暂停当前线程,请执行此操作。如果不这样做,请不要。

答案 2 :(得分:13)

如果从T2呼叫T1.join();,它将等待T1死亡(完成)。它是一种线程同步的形式,但是从你描述的内容中你可以简单地触发两个线程并且根本不使用join。如果您使用两个线程,那么工作将并行完成,如果您只将代码放在一个线程中,那么工作将按顺序完成。

答案 3 :(得分:5)

以下是使用join的原因:当最终结果取决于可以同时运行的两个任务的结果时,可以使用它。

例1: 用户单击“提交”按钮后,程序必须调用两个外部Web服务来更新其各自的系统。它可以在同一时间完成,这就是为什么我们要为其中一个webservices创建一个单独的线程。

用户将坐在屏幕前等待通知:您提交的内容确定无误!两个线程完成后,屏幕应该说OK。

答案 4 :(得分:2)

两件事。

只有当一个线程必须等待open才能完成时才使用(假设线程A准备一个文件,并且线程B在文件就绪之前无法继续)。有一些实例,其中线程是独立的,不需要连接(例如大多数守护程序线程)。

使用线程可以获得以下几点: - 主要是执行顺序的独立性。让我们说你有一个程序,当你按下按钮做一些繁重的处理。如果在主线程中执行该处理,则GUI将冻结,直到任务完成。如果在另一个线程中进行处理,则GUI线程被“释放”,GUI继续工作。 - 在一些(大多数)现代计算机中,创建多个线程可以允许操作系统使用不同的核心来服务不同的线程,从而提高性能。

缺点是复杂性更大,因为您需要其他线程执行状态的信息。

答案 5 :(得分:1)

您可以使用类似java.util.concurrent.CountDownLatch的内容,例如:

CountDownLatch doneSignal = new CountDownLatch(2);

并在完成后让每个线程countDown(),因此主线程知道两个线程何时完成。

答案 6 :(得分:0)

  

使用Join也像我们可以在T1线程中添加T2线程的代码

join()就像方法名称暗示等待线程死亡并在执行结束时加入它。您可以在另一个内部添加一个线程的代码,但这会破坏使用2个单独的线程同时运行您的作业的目的。将一个代码放在另一个代码之后将按顺序运行您的语句。没有并发性。

如有疑问,请参阅javadocs - http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29

答案 7 :(得分:0)

如果T1和T2执行不同的任务,这些任务不依赖于彼此引起的状态变化 - 您不应该加入它们以获得并行执行的优势。如果存在状态依赖关系,则应使用wait / notify或甚至.Join()等机制同步两个线程,具体取决于您的用例。

至于组合两个线程的run()方法,它完全由你自己决定。我的意思是,你应该理解为什么两个线程都具有不同的“类型”(因为它们具有不同的run()体)。这是设计方面,而不是性能方面。

答案 8 :(得分:-7)

主要区别在于当我们用T1连接T2线程时,T1执行该工作的时间也可以被T1利用,这意味着他们将完成不同的工作。但是当你包含T2线程时这不会发生T1线程内的代码。