Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们应该使用连接线程?_Java_Multithreading - Fatal编程技术网

Java 为什么我们应该使用连接线程?

Java 为什么我们应该使用连接线程?,java,multithreading,Java,Multithreading,我有两个线程T1和T2,它们都有不同的工作,所以通常我们更喜欢通过线程连接来完成这个任务 但是我们可以不使用join()来实现这一点。我们可以在T1线程中添加T2线程的代码。 这有什么区别呢?主要区别是,当我们将T2线程与T1连接时,T1也可以利用T2执行作业的时间,这意味着它们将并行执行不同的作业。但是,如果将T2线程代码包含在T1线程中,则不会发生这种情况。如果调用T1.join()从T2开始,它将等待T1死亡(完成)。这是线程同步的一种形式,但根据您所描述的,您可以简单地触发两个线程,而不

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

但是我们可以不使用join()来实现这一点。我们可以在T1线程中添加T2线程的代码。
这有什么区别呢?

主要区别是,当我们将T2线程与T1连接时,T1也可以利用T2执行作业的时间,这意味着它们将并行执行不同的作业。但是,如果将T2线程代码包含在T1线程中,则不会发生这种情况。

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

加入一个线程意味着一个线程等待另一个线程结束,以便您可以安全地访问其结果,或者在两个线程都完成其工作后继续

示例:如果在主线程中启动一个新线程,并且两个线程都做了一些工作,则会在新创建的线程上加入主线程,导致主线程等待第二个线程完成。因此,在到达连接点之前,您可以并行地做一些工作

如果将作业分为两部分,由不同的线程执行,则可能会获得性能改进,如果

  • 线程可以独立运行,也就是说,如果它们不依赖于彼此的数据,则必须同步,否则会降低性能
  • JVM能够并行执行多个线程,也就是说,您有一台超线程/多核机器,JVM利用了它

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

CountDownLatch doneSignal = new CountDownLatch(2);
当每个线程都完成时,让它们倒计时()
,以便主线程知道两个线程何时完成。

两件事

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

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

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

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

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

使用Join还可以将T2线程的代码添加到T1线程中

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


如有疑问,请参阅javadocs-

如果T1和T2执行的任务不同,且不依赖于彼此引起的状态更改,则不应加入它们以获得并行执行的优势。如果存在状态依赖关系,则应根据您的用例,使用wait/notify甚至.Join()等机制同步两个线程


至于,将两个线程的run()方法结合起来,这完全由您决定。我的意思是,您首先应该理解为什么两个线程都是不同的“类型”(因为它们有不同的run()主体)。这是一个设计方面,而不是性能方面

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

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


用户将坐在屏幕前等待通知:您的提交是确定的!只有在两个线程都完成后,屏幕才会显示OK。

+1表示讽刺和正确。说得好-你抓住了一个错误的问题-在我必须说的问题中选择了错误的词语:-)@reared。我看不到任何“用词不当”。我只是看到了一个基于假前提的低质量问题。没有办法重写它来修复它。是的,这就是我的意思。错误的前提。“何时”应该加入()线程是一个有效的问题。投票被否决,因为这个答案是错误的。从T1调用T2.Join()的整个想法是让T1等待T2完成。这是公认的答案吗?这是完全错误的。@RecursiveException他怎么错了??如果T1和T2代码按顺序放在同一代码中,并且说运行这些代码需要T1、T2时间,那么执行时间将是(T1+T2),但是如果使用T1和T2,执行时间将是T1或T2,以最大值为准,仍然小于T1+T2,因此将完成得更快!!普瑞西斯。简短易懂。。!!如果需要通过
线程
获取计算结果,则不需要使用
线程.join()
。也可以。如果需要通过
线程
获取计算结果,则不需要使用
线程。