我有两个线程T1和T2,两个都有不同的工作,所以我们通常更喜欢通过线程连接来完成这个任务。
但我们可以使用join()完成此操作。我们可以在T1线程中添加T2线程的代码。 这有什么不同?
答案 0 :(得分:21)
加入一个帖子意味着一个人等待另一个人结束,这样你就可以安全地访问结果,或者在两个人完成工作后继续。
示例:如果您在主线程中启动一个新线程并且两者都做了一些工作,那么您将加入新创建的线程上的主线程,导致主线程等待第二个线程完成。因此,您可以并行完成一些工作,直到您到达联接。
如果将作业拆分为由不同线程执行的两个部分,则可以获得性能提升,如果
答案 1 :(得分:19)
通常我们更喜欢通过线程连接完成此任务。
不,我们不。我们通过启动两个线程完成此任务。没有义务使用join()
因此没有“应该”使用它。如果要在另一个线程完成时暂停当前线程,请执行此操作。如果不这样做,请不要。
答案 2 :(得分:13)
如果从T2呼叫T1.join();
,它将等待T1死亡(完成)。它是一种线程同步的形式,但是从你描述的内容中你可以简单地触发两个线程并且根本不使用join。如果您使用两个线程,那么工作将并行完成,如果您只将代码放在一个线程中,那么工作将按顺序完成。
答案 3 :(得分:5)
以下是使用join的原因:当最终结果取决于可以同时运行的两个任务的结果时,可以使用它。
例1: 用户单击“提交”按钮后,程序必须调用两个外部Web服务来更新其各自的系统。它可以在同一时间完成,这就是为什么我们要为其中一个webservices创建一个单独的线程。
用户将坐在屏幕前等待通知:您提交的内容确定无误!两个线程完成后,屏幕应该说OK。
答案 4 :(得分:2)
两件事。
只有当一个线程必须等待open才能完成时才使用
使用线程可以获得以下几点: - 主要是执行顺序的独立性。让我们说你有一个程序,当你按下按钮做一些繁重的处理。如果在主线程中执行该处理,则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线程内的代码。