多线程-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方法调用结束并不意味着对应的线程已经开始运行,这个线程可能稍后会运行,甚至永远都不会被运行。

 

转载于:https://www.cnblogs.com/wenq001/p/9118336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值