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

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

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

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

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

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

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

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

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

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

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

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

用户将坐在屏幕前等待通知:您的提交正常! 两个线程完成后,屏幕应该说OK。

两件事情。

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

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

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

你可以使用类似java.util.concurrent.CountDownLatch东西,例如:

 CountDownLatch doneSignal = new CountDownLatch(2); 

并且每个线程在完成时都有countDown() ,所以主线程知道两个线程何时完成。

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

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

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

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

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

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