这个问题很好,你接着看完后面的视频就会明白了。
这里要看Thread的源代码了:
Thread的run方法的实现
1 public void run() {
2 if (target != null) {
3 target.run();
4 }
5 }
这里的tagert就是传入的Runable的实现子类。
注意:1,使用继承Thread创建线程类时,需要重写run方法,因为默认的run方法什么也不干。
2,当我们使用Runnable接口实现线程类时,为了启动线程,需要先把该线程类实例初始化一个Thread,实际上就执行了如下构造函数:
1 public Thread(Runnable target) {
2 init(null, target, "Thread-" + nextThreadNum(), 0);
3 }
(init为内部初始化方法,不用理解。)
所以即是把线程类的引用保存到target中。这样,当调用Thread的run方法时,target就不为空了,而是继续调用了target的run方法,所以我们需要实现Runnable的run方法。这样通过Thread的run方法就调用到了Runnable实现类中的run方法。
这也是Runnable接口实现的线程类需要这样启动的原因。
|