zoukankan      html  css  js  c++  java
  • 多线程-Thread、Runnable 创建线程和调用过程分析

    创建线程的两种方式:

      1:创建Thread类的子类 ---基于继承的技术 。

      2:以Runnable接口实例为构造参数直接通过new  创建 Thread 实例。---基于组合的技术。

    public class ThreadOne extends  Thread {
        @Override
        public void run() {
            System.out.println( Thread.currentThread().getName());
        }
    }
    
    public class ThreadTwo implements Runnable{
        @Override
        public void run() {
            System.out.println("runnable Thread:"+Thread.currentThread().getName());
        }
    }
    
    public class ThreadTest {
        public static void main(String[] args) {
            ThreadOne thread1 = new ThreadOne();
            thread1.start();
            Thread thread = new Thread(new ThreadTwo());
            thread.start();
        }
    }

    无论是实现runnable 接口,还是继承Thread实例实现多线程,run方法都是线程的任务处理逻辑的入口,它由java虚拟机在运行相应线程直接调用,而不需要代码进行调用。

    跟进Thread的有参构造函数和Thread.run()的源码

        public Thread(Runnable target) {
            init(null, target, "Thread-" + nextThreadNum(), 0);
        }
      public void run() {
            if (target != null) {
                target.run();
            }
        }

    得知,如果target不null,则调用target.run(),否则什么也不做;其中实例变量target 的类型为 Runnable, 如果实例线程是通过构造器Thread(Runnable target)创建的,那么target为构造器的参数值,则执行Runable 实例的run方法,否则,如果是通过Thread的的子类创建的线程对象,子类必须重新run()方法,否则父类Thread什么也不处理。上面就是线程调用run方法的过程。

    Thread 类的start 方法的作用是启动相应的线程,启动一个线程的实质是请求java虚拟机运行相应的线程,而这个线程具体何时能够运行是由线程调度器(Scheduler)决定的,所以,start方法调用结束并不意味着对应的线程已经开始运行,这个线程可能稍后会运行,甚至永远都不会被运行。

  • 相关阅读:
    1scala基础
    3scala高级
    03spark kafka
    01spark基础
    04spark streaming
    2scala集合
    02spark sql
    学习java程序设计环境的心得
    第五章继承
    第二周学习Java心得
  • 原文地址:https://www.cnblogs.com/wenq001/p/9118336.html
Copyright © 2011-2022 走看看