【问题标题】:What happens with a finished thread?完成的线程会发生什么?
【发布时间】:2014-06-20 17:54:34
【问题描述】:

相对于这篇文章: use java execute shell command

这段代码执行后

ExecutorTask task = new ExecutorTask();
Thread executorThread = new Thread(task);
executorThread.start();

当“task”完成其工作时,task 和 executorThread 对象会发生什么? 变成空了?线程仍在内存中但停止了? GC 会收集吗?

我的实际问题是: 当可运行对象完成其工作时,线程对象会发生什么?

【问题讨论】:

  • 它将像任何其他普通对象一样继续存在,除非您不再引用它。然后它将像任何其他普通对象一样进行垃圾收集。

标签: java multithreading task


【解决方案1】:

线程是对象,服从 GC。但是,即使您的代码都没有保留对线程的引用,它也不会被 GC 处理,直到它的 run 方法返回。你的任务是一个更普通的对象;线程有对它的引用,如果你没有对它的其他引用,它们将一起变成垃圾。

回应评论:不要以任何不同的方式对待线程,就像对待其他任何事情一样。通过创建一百万个东西并在您不想要它们时保留对它们的引用,总是有可能在 Java 中编写内存泄漏代码。另一方面,很多时候,当我们只是“自然地”编写代码时,事情就变成了垃圾。如果您创建线程并将它们放在一个数组列表中,那么只有在(a)您创建无限数量的线程,并且(b)您从不放开数组列表时才会出现问题。例如,如果您的程序为每个传入连接创建一个新线程,并将它们粘贴到列表中,并且永远不会删除它们,并且列表(本质上)是一个全局变量。一种可能过于复杂的机制是在将线程放入列表之前将其包装在 WeakReference 或 SoftReference 中,但是您仍然会泄漏列表空间。

【讨论】:

  • 我明白了。因此,要完成一项干净的工作,我必须将“任务”对象与任何其他对象解除绑定,并且 GC 将在线程完成时清理这两个对象。它是正确的? PS:我把task放在了一个ArrayList中,所以我必须把它移到GC做一个清理。
猜你喜欢
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2013-11-26
  • 2011-12-23
  • 2022-10-13
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多