前言:
直接调用run()方法不会创建线程,如果调用start()方法会新建线程,然后自动调用run()方法
证明:
1、直接调用run()方法
// 定义分支线程名称为branch
Thread t = new Thread("branch"){
@Override
public void run(){
// 输出执行run()方法的线程名称
System.out.println(Thread.currentThread().getName());
}
};
// 直接调用run()方法
t.run();
结果:
main
解释:
不会新建分支线程,相当于新建了Thread类的一个对象,然后执行了对象的一个方法,所以打印出来的线程名称是main,这代表主线程
2、调用start()方法,然后分支线程自动调用run()方法
// 定义分支线程名称为branch
Thread t = new Thread("branch"){
@Override
public void run(){
// 输出执行run()方法的线程名称
System.out.println(Thread.currentThread().getName());
}
};
// 直接调用run()方法
t.start();
结果:
branch
解释:
由于使用的是start()方法,所以会创建分支线程,然后分支线程会自动调用run()方法,由于是分支线程调用的run()方法,所以返回的线程是分支线程branch
实战案例:
下段代码的运行结果
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run(){
bar();
}
};
t.run();
System.out.print("foo");
}
static void bar(){
System.out.print("bar");
}
结果:
barfoo
解释:
由于是直接调用run()方法,所以不会新建分支线程,上面的操作相当于新建了一个线程对象,线程对象中重写了run()方法,然后线程对象去调用重写的run()方法,run()方法中会调用bar()方法输出bar,最后执行输出语句输出foo,所以最终结果是barfoo