我现在正在学校学习线程,我们必须编写一个使用多个线程的程序,但是在我使用thread.join()
它的工作原理应该是现在,但我不完全确定发生了什么。
最初我有这样的事情。它导致线程的输出相互冲突。
t1.start();
t2.start();
t3.start();
然后我做了这个,输出很好,并且得到了正确答案。
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
我的问题是,第一个例子与第二个例子相比发生了什么?我一直在谷歌搜索和搜索stackoverflow,但似乎找不到完全帮助我理解的答案。
答案 0 :(得分:3)
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 );
答案 1 :(得分:0)
作为javadoc:
等待此线程死亡。调用此方法的行为 与调用
的方式完全相同
因此,当您调用t1.join();
线程时,您已拨打电话等待t1
完成,然后再执行下一行。如果t1
永远不会完成,则永远不会执行下一行。
答案 2 :(得分:0)
你做的第二个例子实际上类似于单个线程 - 意味着你运行一个线程,等待它完成而不是运行下一个线程。
public final void join():这个java线程连接方法使当前线程处于等待状态,直到调用它的线程死亡。如果线程被中断,则抛出InterruptedException。
在第一个示例中 - 所有线程并行运行
可以看到类似的问题here