java基础之多线程五:实现Runnable的原理
实现Runnable接口的原理.
背景:
多线程的第一种实现方式是::继承Thread类, 因为我们自定义的类(MyThread)是Thread类的子类,
所以MyThread类的对象调用start()方法的时候, 自动调用MyThread#run(), 这个我们可以理解,
但是MyRunnable类是实现了Runnable接口, 而Runnable接口的run()方法和Thread#start()没有关系,
问: 为什么Thread#start(), 会自动调用Runnable接口的子类(MyRunnable)中的 run()方法呢?
通过查看Thread的源码:
public class Thread { private Runnable target; //构造方法 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null); } private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc) { //这里把传进来的Runnable tartget对象赋给了target 所以Thread#start调用run的时候调用的是Runnable#run() this.target = target; } @Override public void run() { if (target != null) { target.run(); } }
可以简单理解为:
public static void main(String[] args) { MyRunnable mr = new MyRunnable(); Thread th = new Thread(mr); th.start(); //为什么会自动调用 MyRunnable#run(); } public class Thread { private Runnable target; //就相当于把传进来的Runnable赋给了Thread的target对象 public Thread(Runnable target) { this.target = target; } public void run() { if(target != null) { target.run(); } } }