Java线程学习记录(二)

start和run方法启动线程对比

public class StartAndRunMethod {
    public static void main(String[] args) {
        Runnable runnable = () -> {
            System.out.println(Thread.currentThread().getName());
        };

        runnable.run();

        new Thread(runnable).start();
    }
}

输出

main
Thread-0

run方法是由主线程去执行的
start启动了子线程

start方法原理

start是请求启动新线程
主线程启动以后会去请求JVM,我有一个子线程要执行任务,JVM会在空闲的情况下去执行。运行线程本质就是去请求JVM来运行线程。
调用start的顺序并不能决定线程的执行顺序,可能线程一线执行start,线程二再执行的start,但是可能存在线程二先执行,线程的执行是由调度器去实现的。
start会让两个线程去执行,一个是主线程,或者是其他的线程来执行start方法,第二个就是我们创建的线程。
准备工作 :线程执行之前也是需要做准备工作,它会去获取除了CPU以外的资源,如:上下文,栈等。当准备完毕之后才可以被JVM调度到执行状态,才能获取到CPU的资源。
不能两次调用start方法
如果对调用两次start方法会抛出异常

Exception in thread "main" java.lang.IllegalThreadStateException

start的运行流程

  1. start启动线程的时候会检查线程状态
  2. 检查完毕之后会加入线程组
  3. 加入线程组之后会调用start0()

从start的源码来看,他有一个threadStatus=0的初始值,表示线程还没有被启动,如果启动了会改变这个值,以至于执行到下面的这段代码,抛出了异常

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

start0()方法是C++写的,这个就不作深入学习

run方法执行

主要的还是以下的三行代码

if (target != null) {
	target.run();
}

就是一个普通方法运行

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值