Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 Thread.join()解释_Java_Multithreading - Fatal编程技术网

Java Thread.join()解释

Java Thread.join()解释,java,multithreading,Java,Multithreading,我现在在学校学习线程,我们必须编写一个使用多线程的程序,但是,直到我使用thread.join,它才正常工作 它现在应该是这样运作的,但我不能完全确定到底发生了什么 原来我有这样的东西。它导致线程的输出相互冲突 t1.start(); t2.start(); t3.start(); 然后我这样做了,结果很好,得到了正确的答案 t1.start(); t1.join(); t2.start(); t2.join(); t3.start(); t3.join(); 我的问题是,与第二

我现在在学校学习线程,我们必须编写一个使用多线程的程序,但是,直到我使用thread.join,它才正常工作

它现在应该是这样运作的,但我不能完全确定到底发生了什么

原来我有这样的东西。它导致线程的输出相互冲突

t1.start();
t2.start();
t3.start();
然后我这样做了,结果很好,得到了正确的答案

 t1.start();
 t1.join();
 t2.start();
 t2.join();
 t3.start();
 t3.join();
我的问题是,与第二个示例相比,第一个示例中发生了什么?我一直在Google上搜索stackoverflow,但似乎找不到一个能完全帮助我理解的答案。

t.join会导致当前线程暂停执行,直到t的线程终止

通过这样做:

 t1.start();
 t1.join();
 t2.start();
 t2.join();
 t3.start();
 t3.join();

没有理由使用线程

thead.join使用示例:

假设您需要加密3个文件, 您希望使用线程来加快处理时间,并希望知道这需要多少时间:

int startTime = System.currentTimeMillis();
firstFileEncryptorThread.start();
secondFileEncryptorThread.start();
thirdFileEncryptorThread.start();

firstFileEncryptorThread.join();
secondFileEncryptorThread.join();
thirdFileEncryptorThread.join();

System.out.println(System.currentTimeMillis() - startTime );
作为javadoc:

等待此线程死亡。此方法的调用在 与调用的方式完全相同


所以当你调用t1.join;在执行下一行之前,使调用等待t1完成的线程。如果t1从未完成,则下一行将永远不会执行。

第二个示例实际上与单线程类似,即运行一个线程,等待它完成,然后运行下一个线程

public final void join:这个java线程连接方法将当前线程置于等待状态,直到调用它的线程死亡。如果线程被中断,它将抛出InterruptedException

在第一个示例中,所有线程都并行运行


可以看到类似的问题

所以t2不依赖于t1?这是否意味着它们可以彼此并行运行?这就是线程的概念。执行检查:t1.启动;t2.启动;t1.加入;更详细地说,由于您总是在启动下一个线程之前等待上一个线程完成,因此一次运行的线程不会超过1个,这几乎完全违背了使用线程的目的。我看到了,我看到一篇关于线程同步的帖子,但在我发表评论时,它被删除了。我的线程都在同一个2D数组上执行操作。因此,我将不做thread.join,而是研究线程同步没有理由使用线程。。。所以join方法是由错误引入的?:-事实上,如果一个线程等待输入另一个线程终止的结果,则必须使用join@davidxxx当然,但在他使用它的方式,他甚至不需要线程。这和这样做是一样的:methodA;方法b;方法c@davidxxx您可能会加入这样的案例,但如果您只是对计算进行排序,我看不出首先使用线程有什么好处。如果您希望计算与主线程并行运行,那么您最好只在一个派生线程上运行它,而不是在多个派生线程上运行并链接它们。如果您的程序在调用.join之前不工作,那么您很可能在没有完整代码的情况下遇到了同步问题,这很难说。如果你在3个线程中共享和修改相同的对象,你可能想使用某种同步方法来研究,这正是我现在要研究的,我偶然发现了一篇关于。我正在跨线程共享一个2D数组。您很可能希望查看synchronized关键字或Jayfray,我希望我能将您的评论标记为正确!同步解决了这个问题!谢谢。从技术上讲,同步化不是你问题的答案。你问过使用join和不使用join有什么区别。虽然我从字里行间看出了你的问题所在。很高兴我能帮忙。