Thread类启动的源码

1、start方法

public synchronized void start() {
     
  if (threadStatus != 0)
       throw new IllegalThreadStateException();

   group.add(this);    
   boolean started = false;
   try {
       start0();              //启动线程
       started = true;
   } finally {
       try {
           if (!started) {
               group.threadStartFailed(this);
           }
       } catch (Throwable ignore) {
           /* do nothing. If start0 threw a Throwable then
             it will be passed up the call stack */
       }
   }
}

分析
1)线程执行过一次后,他的threadStatus一定会变为非0。对一个线程多次执行start()方法,会抛出IllegalThreadStateException异常。

if (threadStatus != 0)
    throw new IllegalThreadStateException();

2)将当前线程加入他属于的那个线程组

group.add(this);

3)实际启动一个线程

start0();

点击 start0()进入如下代码,可知,这是一个native的方法。

private native void start0();    

4)start0()成功启动后,下一步会去调用run()方法。如果创建线程是通过实现Runnalbe接口的方式,这里调用的就是那个Runnable对象的run()方法;如果是继承Thread类的方式,就会执行你重写的run()方法。这里的target表示Runnable。

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

2、总结

1)一个线程启动后,threadStatus就是非0了,就不能再重新启动了,start方法不能再次调用。
2)线程启动后,会加入一个线程组中。
3)启动一个线程实际是走start0(),是native方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值