您的位置:首页 > 其它

线程中start()和run()方法的区别

2020-07-14 06:31 176 查看

1.分析线程的执行流程(代码角度)

在我们创建一个thread对象后,并未和操作系统的系统联系在一起,只是单纯的取出了Thread的一个实例对象,此时线程还是处于一个新建的状态;在调用start()方法后,线程由新建转变为可运行状态,注意此时线程并未开始执行任务,处于一种等待的状态,所以run()方法还未被执行;在cpu分配给当前线程运行的时间片后,此时线程会执行线程体,也就是我们所谓的run()方法;在run()方法执行完后,线程的整个生命周期也就结束了。

2.总结具体不同

2.1 start()方法是开启线程的入口,run()方法只是封装了线程执行的业务逻辑代码;
2.2 start()方法不可重复调用,run()方法可反复调用;
2.3 调用start()方法后,真正执行线程体的线程是当前创建的thread对象;直接调用run()方法的话,真正执行线程体的线程是main主线程;

3.注意事项

如果多次调用start()方法,会抛出IllegalThreadStateException异常,该线程属于线程状态异常;
因为在start()的源码中可以看到【if (threadStatus != 0) throw new IllegalThreadStateException();】这段代码,实际就是对线程的状态作了一个限制处理,我们知道线程是由新建,就绪,阻塞,运行,死亡这五种状态,也就表示threadStatus这个状态值存在五种,当为0时,表示线程处于新建状态;假设调用两次start()方法,第一次调用时,会判断此时线程是否处于新建状态,在第一次start()调用结束后,线程是处于死亡状态的,自然threadStatus的值不会为0,【private volatile int threadStatus = 0;】threadStatus这个变量是Thread内部维护的一个私有的变量,而且还加上了volatile保证其值不会被改变,因此在第二次调用start()才会抛出异常。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: