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(); 
        }
    }
    
}

猜你喜欢

转载自www.cnblogs.com/Alex-zqzy/p/9153448.html