【问题标题】:Java Threads, join() taking too long?Java 线程,join() 耗时太长?
【发布时间】:2013-11-10 17:35:32
【问题描述】:

所以我有一些代码,我正在创建 6 个线程,在我的主线程中运行一些代码。我开始线程。然后我在线程上调用join(),以便主线程在继续执行之前等待它们全部死亡。

现在,我正在使用一些非常基本且很可能不准确的方法来衡量我的代码运行所需的时间。只需调用在开始、结束时获取系统时间,然后打印差异。

假设运行我的所有代码大约需要 500 毫秒。

我决定删除每个线程对join() 的调用,而我只是告诉我的主线程休眠 20 毫秒。这导致我的代码在大约 200 毫秒内完成,并且主线程设法使用来自工作线程的正确数据继续执行 - 即 6 个工作线程必须在 20 毫秒的等待中完成。

因此,为什么在每个工作线程上使用 .join 会花费这么长时间?自然,我不能在 main 方法中保持对sleep(20) 的调用,而宁愿使用join() 之类的东西

【问题讨论】:

  • 区别在于join是正确的解决方案,而sleep不是。由于您编写的实际代码的某些巧合,它可能会起作用,但不能保证总是有效。我认为您应该编写一些重要的代码以使事情更清晰。
  • 您能否让每个线程打印一些内容以确认它们已完成。
  • 6个线程的计算是否占用CPU?
  • 看起来工作线程并没有在工作完成后立即死亡。
  • 您是否通过让工作线程自己打印结果来从工作线程中找到正确的数据?如果是这样,请先尝试在线程上调用 setDaemon(true),然后您会发现它们实际上并没有完成。默认情况下,main 将等待所有线程完成。

标签: java multithreading join


【解决方案1】:

多线程错误的问题是,当它不能可靠地工作时,你可能看起来正在工作。有可能您的线程最终正在做您不需要的事情,或者您加入线程不会立即使用结果。无论如何,我建议您正确等待结果。

顺便说一句,我会使用 ExecutorService,因为它允许您回收线程并以Future<MyResult> 的形式等待您需要的结果,注意这也捕获并抛出异常/错误。

【讨论】:

    【解决方案2】:

    如果您取出连接,您的代码也可能根本没有完成。如果您的 main 函数在没有加入其所有线程的情况下退出,那么有可能通过 setDaemon() 将某些线程设置为守护线程,这将阻止程序清理等待它们。

    你拥有所有涉及的代码吗?

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多