首先你要明确这两个方法的区别:
strart()方法,用于启动一个线程。(线程会处于就绪状态,执行的时候底层会调用run())。
而run()只是对象的一个普通的方法。(只不过是用来存放线程的运行代码而已,就这点特殊)
调用前者会启动一个线程,而后者只是普通的对象调用方法。所以这就明了了。
其他的再交替完成
第一次:当然先执行对象调用方法呗,即由main线程一次性把MyThread中的run()先完成,
然后是main线程和 new Thread(new MyRunnable()).start(); 共两个线程交替抢夺CPU执行权,去运行。
第二次:与第一次同理, new MyThread().start();和main两个线程,在调用对象的方法。
这里有一个重要的知识点:当一个Thread类接受一个Runnable接口的实现类时,在调用Thread类的run方法,他会先判断,不为空则调用接口实现类的。
Thread的源代码:
构造函数:传递的Runnable 实现类
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
接着调用init初始化方法:
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
this.target = target;
。。。。。。。。。
}
然后判断:
public void run() {
if (target != null) {
target.run();
}
}
所以很明白的调用 MyRunnable的run方法;
总之记住原则:调用start方法才会开启线程,调用run只是对象调用方法
建议你吧毕老师java基础里的线程那一块,认真看一遍,就会有收获的,加油,一起进步 |