public class MyRunnable implement Runnable{
public void run(){
while(true){
System.out.println("Hello");
}
}
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
System.out.println("After1"); // 这里打个断点
System.out.println("After2");
System.out.println("After3");
}
}
Thread源码中的run方法也打个断点
public void run() {
if (target != null) { // 这里也打个断点
target.run();
}
}
程序的运行情况如下图,启动一个线程后,main线程直接执行到下一条语句
这时启动线程执行到run()方法中,此时run方法其实已经持有启动线程Thread的对象引用this,所以不会启动后的Thread对象是不会被GC回收的
我写的代码里都是直接newThread的类直接启动线程,这里会有一个奇怪的问题,构建的这个对象没有被任何变量所引用,按照java里垃圾回收机制,thread对象会被马上进行回收,但是事实上构建的对象并没有被及时回收,这是为什么呢?因为每一个新建的thread对象都只有离开了run方法后才能把它清理掉,换句话说只要thread的run方法还在执行时候不管这个thread对象处在什么状态下,thread对象都不会被回收,因为Thread的run()方法的局部变量this保持了对线程对象Thread的引用.