java线程完成后会被删除吗

java线程完成后会被删除吗,java,multithreading,concurrency,Java,Multithreading,Concurrency,假设我使用下面的方法每隔几秒钟生成一个线程,每个线程大约需要一秒钟才能完成。完成的线程是否被删除 new Thread (new myRunnableClass()).start(); 我不认为它被删除了。一旦线程完成,它将进入死状态,准备由JVM进行垃圾收集 生成新线程是一个非常昂贵的过程。您需要的是一个线程池。有不同的方法可以做到这一点-。本机操作系统级线程在线程完成后立即释放(大约在run()完成时),但是线程对象与任何其他对象一样,会一直存在,直到它变得不可访问并且垃圾收集器感觉像在运

假设我使用下面的方法每隔几秒钟生成一个线程,每个线程大约需要一秒钟才能完成。完成的线程是否被删除

new Thread (new myRunnableClass()).start();

我不认为它被删除了。一旦线程完成,它将进入死状态,准备由JVM进行垃圾收集


生成新线程是一个非常昂贵的过程。您需要的是一个线程池。有不同的方法可以做到这一点-。

本机操作系统级线程在线程完成后立即释放(大约在
run()
完成时),但是线程对象与任何其他对象一样,会一直存在,直到它变得不可访问并且垃圾收集器感觉像在运行


Edit:了解
Thread
(在Sun的Oracle实现中,anywho)有一个私有方法,当线程退出时由VM调用,该方法会积极地将几个字段置空,包括引用
Thread(Runnable)
构造函数设置的
Runnable
的字段。因此,即使您保留了对
线程的引用
,它在完成执行后不需要的东西也将被释放。

如果过程像您的示例一样简单,并且每个线程都保证在下一个线程开始之前完成,您能重用一个线程吗?我猜你的实际计划要比这复杂得多,但我只是把这个建议抛在脑后。@musicfreak:你知道,你刚刚提出了一个非常好的观点。出于某种原因,我在其他地方也这样做过,我想这种情况看起来有点不同,但我找到了一种方法,将这种技术应用到我的问题中。谢谢除非其他“活动”数据结构维护对线程对象的引用。以OP中提出的例子来说,这不会是一个问题。。。。但是,这是一种模式,当您想
join()
线程时,比如说,从
Runnable
检索一些结果,但是在您的示例中,您不能这样做,因为
Runnable
引用丢失了。在很久以前的nix系统(*即Linux)中,生成线程的成本很高,但是在内核2.4中(还是2.6?)他们更改了线程系统,因此生成新线程现在几乎是免费的。请注意,在Windows环境中,生成线程的成本一直很低。也就是说,使用线程池是一件明智的事情,因为通常会有一些开销,而且当大约有十几个线程运行时,您很少真正需要有十亿个线程在运行我也是。