Java多线程start()方法原理解析

网友投稿 249 2022-12-22


Java多线程start()方法原理解析

1、为什么启动线程不用run()方法而是使用start()方法

run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样

而start()是创建线程等一系列工作,然后自己http://调用run里面的任务内容。

验证代码:

/**

* @data 2019/11/8 - 下午10:29

* 描述:run()和start()

*/

public class StartAndRunMethod {

public static void main(String[] args) {

Runnable runnable = new Runnable() {

@Override

public void run() {

System.out.prigJIERUILmantln(Thread.currentThread().getName());

}

};

runnable.run();

new Thread(runnable).start();

}

}

结果:

main

Thread-0

2、start()源码解读

启动新线程检查线程状态

public synchronized void start() {

/**

* This method is not invoked for the main method thread or "system"

* group threads created/set up by the VM. Any new functionality added

* to this method in the future may have to also be added to the VM.

*

* A zero status value corresponds to state "NEW".

*/

if (threadStatus != 0)

throw new IllegalThreadStateException();

关于threadStatus源码:

/*

* java thread status for tools, default indicates thread 'not yet started'

*/

private volatile int threadStatus;

通过代码可以看到就是threadStatus就是记录Thread的状态,初始线程默认为0.

加入线程组

/* Notify the group that this thread is about to be started

* so that it can be added to the group's list of threads

* and the group's unstarted count can be decremented. */

group.add(this);

调用start0()

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 */

}

}

}

start0()方法使用c++编写的方法,这些代码在gdk代码中,所以这里不再这里探究了。

3、start()方法不能使用多次

通过刚刚源码分析,就知道start方法刚开始就检查线程状态,当线程创建后或结束了,该状态就不同于初始化状态就会抛出IllegalThreadStateException异常。

测试代码:

start不可以使用多次

/**

* @data 2019/11/8 - 下午11:57

* 描述:start不可以使用多次

*/

public class CantStartTwice {

public static void main(String[] args) {

Thread thread = new Thread();

thread.start();

thread.start();

}

}

4、注意点:

start方法是被synchronized修饰的方法,可以保证线程安全。

由jvm创建的main方法线程和system组线程,并不会通过start来启动。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring如何加载配置多个配置文件
下一篇:Springboot分页插件使用实例解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~