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(); 
            }
        }
        
    }
  • 相关阅读:
    正则表达式-元字符
    利用shell脚本实现nginx 的logs日志分割
    Linux下 nfs部署
    Linux下 niginx部署
    linux 硬盘分区与格式化挂载 (二)
    linux 硬盘分区与格式化挂载
    linux 系统监控
    [LeetCode] Best Time to Buy and Sell Stock
    [LeetCode] Convert Sorted Array to Binary Search Tree
    [LeetCode] Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9153448.html
Copyright © 2011-2022 走看看