2

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

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

例如,运行我的所有代码大约需要 500 毫秒。

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

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

4

2 回答 2

3

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

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

于 2013-11-10T17:43:07.593 回答
0

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

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

于 2013-11-10T19:24:34.993 回答