线程实例,run方法,以及内存回收

qq_15357533 2021-01-27 10:15:59
线程实例Thread thread1 , 当它的run方法无限循环后,再把它设为null 。 thread1 = null;, thread1实例在内存中有没有可能被回收?

如果被回收,它的run方法还会继续运行吗?
...全文
371 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-03-04
  • 打赏
  • 举报
回复
引用 楼主 qq_15357533 的回复:
线程实例Thread thread1 , 当它的run方法无限循环后,再把它设为null 。 thread1 = null;, thread1实例在内存中有没有可能被回收? 如果被回收,它的run方法还会继续运行吗?
线程对象,在run方法没有退出(正常返回或抛出异常)时,是不会被垃圾回收的。 尽管你的代码没有显式的引用线程对象,但是,JVM内部是有线程管理器的。 你创建的线程对象,会被线程管理器引用。 我记得使用Runtime类,能够得到当前环境下的所有线程对象。 另外,线程的run方法中,最忌讳死循环这种结构,虽然Java有垃圾回收机制,但是,我们编程也要讲究优雅的退出。
wdubaiyu 2021-02-25
  • 打赏
  • 举报
回复
 while (true){} ???????????
rumlee 2021-01-28
  • 打赏
  • 举报
回复
不会被回收,对于线程对象的垃圾回收,垃圾回收器有特殊的处理,即使没有任何引用指向也不会被回收,直到线程执行结束以后才可能被回收。 所以你的run方法还会继续运行吗的问题就不存在了,当然会继续运行。
KeepSayingNo 2021-01-28
  • 打赏
  • 举报
回复
你这个线程方法会执行线程内部的逻辑,你内部又是一个死循环,不会跳出来被置空
叫练 2021-01-28
  • 打赏
  • 举报
回复
/**
 * @author :jiaolian
 * @date :Created in 2021-01-28 14:50
 * @description:回收线程测试
 * @modified By:
 * 公众号:叫练
 */
public class GCThreadTest {

    public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread(()->{
            while (true){}
        });
        thread.start();
        Thread.sleep(1000);
        thread = null;
    }
}
用实例说话,1秒后thread 线程还在运行,说明线程不会被回收。同时印证了楼上大佬说的"对于线程对象的垃圾回收,垃圾回收器有特殊的处理",多动手理解的可能更深刻,希望回答对你有所帮助!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧