相对于这篇文章: use java execute shell command
执行此代码后
ExecutorTask task = new ExecutorTask();
Thread executorThread = new Thread(task);
executorThread.start();
当" task"时,task和executorThread对象会发生什么?完成它的工作? 变成空?线程仍在内存中但已停止? GC会收集它们吗?
我的实际问题是: 当runnable对象完成其工作时,线程对象会发生什么?
答案 0 :(得分:3)
线程是对象,受GC限制。但是,即使您的代码都没有保留对线程的引用,在它的run方法返回之前它也不会被GC。你的任务是一个更普通的对象;线程有一个对它的引用,如果你没有引用它,它们将变成垃圾。
回应评论:不要对待线程与处理其他任何事情的方式不同。通过创建数百亿的东西并在不需要时保留对它们的引用,总是可以在Java中编写内存泄漏代码。另一方面,在大多数情况下,当我们“自然地”编写代码时,事情就会变得充满垃圾。如果你创建线程并将它们放在一个数组列表中,那么只有(a)你创建一个无限数量的线程,并且(b)你永远不会放弃数组列表时,这只是一个问题。例如,如果你的程序为每个哦,传入的连接创建一个新线程,并将它们粘贴到List中,并且永远不会删除它们,并且列表(基本上)是一个全局变量。一个可能过于复杂的机制是在将线程放入列表之前将线程包装在WeakReference或SoftReference中,但是你仍然在泄漏列表空间。