当前位置: 首页 > 知识库问答 >
问题:

Java线程,join()耗时太长?

慎俊艾
2023-03-14

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

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

比方说,运行我的所有代码大约需要500毫秒。

我决定删除每个线程对join()的调用,而是让我的主线程睡眠20毫秒。这导致我的代码在大约200毫秒内完成,主线程利用工作线程的正确数据继续执行-即6个工作线程必须在20毫秒的等待时间内完成。

因此,为什么在每个工作线程上使用 .join 时花费的时间要长得多?当然,我不能将 main 方法中的调用保留为 sleep(20),而是宁愿使用像 join() 这样的东西

共有2个答案

詹亮
2023-03-14

如果去掉连接,代码也可能无法完成。如果主函数退出时没有加入其所有线程,则有可能通过setDaemon()将一些线程设置为守护线程,这将阻止程序清理等待它们。

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

纪实
2023-03-14

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

顺便说一句,我会使用执行器服务,因为这允许您回收线程,并以未来的形式等待所需的结果

 类似资料:
  • 主要内容:1 什么是Java join()方法,2 Java join()方法语法,3 Java join()方法例子1,4 Java join()方法例子21 什么是Java join()方法 Java join() 方法表示等待线程死亡。换句话说,它导致当前正在运行的线程停止执行,直到与之连接的线程完成其任务为止。 2 Java join()方法语法 3 Java join()方法例子1 输出结果为: 如上例所示,当t1完成其任务时,t2和t3开始执行。 4 Java join()方法例子2

  • 问题内容: 我需要使线程顺序。他们需要按以下顺序启动: 当D完成时,C可以完成,然后B,然后是A。 在这种情况下,最好使用线程或?为什么呢? 我的线程需要启动并打印消息,完成后需要打印。 问题答案: 由于您正在等待“其他”线程完成(即完成执行),因此是更好的选择。 的javadoc 简单地说: 等待该线程死亡。 然后,该机制相对简单: 要说明:您需要参考。因此,指向,指向,指向和不指向任何对象(它

  • 我试图提取顶级URL并忽略路径。我使用的代码如下: 这个脚本已经运行了一个小时了。当我运行它时,它给出了以下警告: 如果有人能给我一个更快的建议,我将不胜感激,也许是“警告”建议的方法

  • 我有一个Kafka流应用程序,它从几个主题中获取数据,并将数据加入另一个主题。 Kafka配置: 注意:我在运行Kafka Brokers的机器上运行Kafka Streams应用程序。 每小时消耗/产生数百万条记录。每当我让Kafka经纪人倒下时,都会进入再平衡阶段,再平衡大约需要30分钟,有时甚至更长时间。 有人知道如何解决Kafka消费者的再平衡问题吗?而且,很多时候,它在重新平衡时抛出异常

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下:

  • 我需要监控应用程序生成的线程所消耗的内存量。如果贪婪的线程占用了太多内存,那么我们可以采取纠正措施。我提到了我的java线程需要多少内存?。关于该链接的建议之一是在ThreadMXBean中使用getThreadAllocatedBytes 我用以下作业试验了getThreadAllocatedBytes。 我在四个线程上运行了相当长的时间。虽然作业不会连续累积内存,但getThreadAlloc