zoukankan      html  css  js  c++  java
  • 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(); 
            }
        }
        
    }
  • 相关阅读:
    GeneXus笔记本—城市级联下拉
    GeneXus笔记本—获取当月的最后一天
    GeneXus笔记本——创建一个知识库 哈哈哈哈!
    GeneXus笔记本——入门篇
    Android Studio 学习笔记1.1 创建自己的第一个安卓项目并且打包APK
    初入Android Studio的我
    随笔
    在Azuer创建自己的Linux_VM
    获得自己电脑的SSH公匙
    数据库内连接、外连接以及左右连接的区别
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9153448.html
Copyright © 2011-2022 走看看