作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
相对于这篇文章: use java execute shell command
执行此代码后
ExecutorTask task = new ExecutorTask();
Thread executorThread = new Thread(task);
executorThread.start();
当“任务”完成其工作时,任务和 executorThread 对象会发生什么?变成空?线程仍在内存中但已停止?GC会收集它们吗?
我的实际问题是:当可运行对象完成其工作时,线程对象会发生什么?
最佳答案
线程是对象,受GC约束。但是,即使您的代码中没有任何代码保留对线程的引用,在其 run 方法返回之前也不会对其进行 GC。你的任务是一个更普通的对象;线程有一个对它的引用,如果你没有其他对它的引用,它们将一起变成垃圾。
回应评论:对待线程不要与对待其他任何东西有任何不同。在 Java 中,通过创建一百万亿个东西并在不需要它们时保留对它们的引用,总是有可能造成内存泄漏。另一方面,很多时候,当我们“自然”地编写代码时,事情到了时间就变成了垃圾。如果您创建线程并将它们放入数组列表中,则只有在以下情况下才会出现问题:(a) 您创建无限数量的线程,并且 (b) 您永远不会放开数组列表。例如,如果您的程序为每个传入连接创建一个新线程,并将它们粘贴到列表中,并且从不删除它们,并且该列表(本质上)是一个全局变量。一种可能过于复杂的机制是在将线程放入列表之前将线程包装在 WeakReference 或 SoftReference 中,但这样仍然会泄漏列表空间。
关于java - 完成的线程会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333041/
我是一名优秀的程序员,十分优秀!