首先:抱歉这个不起眼的问题!
考虑一个正常的基本Java程序:
public class TestClass {
public static void main(String[] args) {
Thread t=new Thread()
{
public boolean isRunning;
public void run()
{
while(isRunning);
}
}
t.isRunning=true;
t.start();
t=null;
}
}
线程会永远不会运行吗?
当我意外地将其设置为null时,如何在上面的代码中停止线程?或者如果由于某种原因Thread对象变得无效会发生什么?
基本上程序是如何表现的?我能以某种方式查询一个正在运行的线程而没有任何引用它,我只是以某种方式停止()它?
那么Thread对象何时还拥有一些需要的数据并将在run方法中使用呢?它们是空的还是仍然可以被访问?
如果是这样,重新获得对象的引用真的很重要
编辑:我在问题中添加了一个android标签。我更想到Android环境。应用程序的进程可以非常容易地被杀死,并且事情可能会出错,以至于线程无效但执行仍在继续,因此再次获取线程的引用非常重要。就像当一个活动被系统杀死时,它对线程的引用也消失了。因此,在发生内存泄漏之前,我必须做些什么来防止在启动另一个之前有一个正在进行的线程
答案 0 :(得分:1)
这是线程泄漏的情况。如果你继续这样做(即开始一个线程并忘记它),你很快就会得到java.lang.OutOfMemoryError: Unable to create new native thread
例外。
您应始终使用受控线程池(如ExecutorService)并在finally
子句中将其关闭,或使用Runtime.getRuntime().addShutdownHook
注册关闭钩子以关闭线程池/线程