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

时间:2013-11-13 17:47:17

标签: java multithreading

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

5 个答案:

答案 0 :(得分:8)

  

我发现我的电脑在执行程序后立即开始承担巨大的负担。 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 tutorial

  

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以阅读Thread's lifecycle。如果run方法结束,那么它们不应该消耗你的cpu。

答案 4 :(得分:0)

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

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