【问题标题】:Thread.join() explanationThread.join() 解释
【发布时间】:2017-07-06 03:22:29
【问题描述】:

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

它现在应该像现在一样工作,但我不完全确定发生了什么。

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

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

然后我就这样做了,输出很好,得到了正确的答案。

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

我的问题是,与第二个示例相比,第一个示例发生了什么?我一直在用谷歌搜索和搜索 stackoverflow,但似乎找不到完全帮助我理解的答案。

【问题讨论】:

  • 如果您的程序在调用.join() 之前无法运行,那么您很可能遇到了同步问题(没有完整的代码很难判断)。如果您在 3 个线程之间共享和修改相同的对象,您可能需要考虑使用某种同步
  • 这正是我现在正在研究的,我偶然发现了一篇文章。我正在跨线程共享一个二维数组。
  • 您很可能希望查看 synchronized 关键字或 ReentrantLock
  • Jayfray 我希望我能将您的评论标记为正确! synchronized 解决了这个问题!谢谢。
  • 从技术上讲,synchronized 不是您问题的答案。您问使用join() 和不使用它有什么区别。虽然我读了字里行间并且知道你的问题是什么。很高兴我能帮上忙。

标签: java multithreading


【解决方案1】:

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 个线程,这几乎完全违背了使用的目的线程。
  • 我知道了,我看到一个帖子在谈论线程同步,但是在我评论的时候它被删除了。我的线程都在同一个二维数组上执行操作。所以我不做thread.join(),而是研究线程同步
  • "没有理由使用线程..." 所以join()方法是错误引入的? :-) 事实上如果一个线程等待另一个线程终止的输入结果,你必须使用join()
  • @davidxxx of corse,但在他使用它的方式上,他甚至不需要线程。与这样做相同:methodA(); methodB(); methodC();
  • @davidxxx 在这种情况下你会得到join,但如果你只是对计算进行排序,我看不出首先使用线程有什么好处。如果您希望计算与主线程并行运行,那么您最好只使用 1 个生成的线程来运行它,而不是生成许多并“链接”它们。
【解决方案2】:

作为一个 javadoc:

等待此线程终止。此方法的调用表现在 与调用方式完全相同

因此,当您调用t1.join(); 时,您已经使调用等待t1 完成,然后再执行下一行。如果t1 永远不会结束,则永远不会执行下一行。

【讨论】:

  • 所以 t2 不依赖于 t1?这是否意味着它们可以彼此并行运行?
  • 这就是线程的概念。通过执行检查: t1.start(); t2.start(); t1.join();
【解决方案3】:

您所做的第二个示例实际上类似于单线程 - 意味着您运行一个线程,等待它完成然后运行下一个线程。

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

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

可以看到类似的问题here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多