繁体   English   中英

一旦线程在java中完成其分配的任务,会发生什么?

[英]What happens to a thread as soon as it has completed its assigned task in java?

我一直在研究一个项目,在该项目中我的程序在执行期间创建了大约500个线程。 我发现,一旦程序执行程序,我的PC就开始承担巨大的负担。 在75%的线程完成工作后,它继续显示负载。 我想知道工作完成的线程是否被杀死。 java如何处理完成工作的线程。 任何帮助......

我发现,一旦程序执行程序,我的PC就开始承担巨大的负担。 在75%的线程完成工作后,它继续显示负载。

如果500个线程中的75%已经完成了他们的工作,那么剩下的100个线程将继续运行。 如果使用大量的CPU,100个线程可以超过一个盒子上的处理器,我假设它没有100个核心。 因此,您的应用程序可能会继续显示100%的CPU利用率,直到运行的线程数低于核心数。

您应该考虑使用固定大小的线程池而不是创建500个并发线程。 然后,您将向线程池提交500个任务 这允许您选择要同时运行的适当数量的线程。 适当数量的线程高度依赖于提交的任务。 更多CPU绑定任务应该使用更少的线程,而IO绑定任务可以使用更多。 在调整线程数的同时对应用程序执行一些测试运行是优化值的最佳方法。 我倾向于从核心数量的2倍开始,然后从那里进行优化。

// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// define your jobs somehow
for (MyRunnable job : jobsToDo) {
    threadPool.submit(job);
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();

有关更多详细信息,请查看ExecutorService教程

我想知道工作完成的线程是否被杀死。 java如何处理完成工作的线程。 任何帮助......

线程最有可能完成。 在线程离开run()方法之后(因为它返回或抛出异常)它将不再使用CPU,并且可以获取或重用其底层本机线程。 如果没有对Thread对象的引用,它的内存最终将由垃圾收集器获取。

只要没有对它的引用,只要它的run方法返回,JVM就会垃圾收集Thread对象。 在run方法返回后,线程自身死了。 它可能仍然在堆中,但它不再拥有自己的堆栈,也没有做任何事情。

线程未被杀死的唯一可能方式是它们仍然执行某些操作或者您忘记清除对线程对象的引用 - 但这与内存相关。

如果您通过线程池分配了线程,则在执行任务后将它们返回到池中。 在这种情况下,它们可能在完成任务后不会被释放。

我们不应该创建很多线程来完成我们的任务,它会给你很多问题,比如OutofMemoryError。 而且线程的创建也是一项代价高昂的任务,因此我们应该考虑线程池,即ExecutorService ,我们在其中一次又一次地重用相同的线程。

但是在线程创建之后,任何回答你问题的方法都会自动死亡,即它将被垃圾收集,你不需要做任何事情。 最初java提供了诸如stop()destroy()但这些方法已被弃用了。

您可以阅读有关Thread的生命周期的信息 如果run方法结束,那么它们不应该消耗你的cpu。

完成工作的线程将会死亡。 它不会消耗更多的CPU时间。

您可以使用jstack来检查java进程中正在运行的线程数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM