一、start()方法
1、start()方法含义
1、启动新线程。当我们执行了start()方法之后这个线程不一定会立刻执行,其实是在告诉jvm中的线程调度器在合适的时间去启动。例如:我们可能会创建两个线程,分别是线程1和线程2,但线程1先调用start()方法,线程2后调用,缺发现线程2先执行,这其实是不违背启动顺序的。也就是说调用start()方法的顺序并不能决定执行的顺序。
2、一个start()方法牵扯到两个线程:新的线程和原来的主线程。
2、 不能重复的执行start()方法
package threadcoreknowledge.startthread;
/**
* 描述: 演示不能两次调用start方法,否则会报错
*/
public class CantStartTwice {
public static void main(String[] args) {
Thread thread = new Thread();
thread.start();
thread.start();
}
}
非法的线程状态
3、start()源码解析
启动新线程检查线程状态
加入线程组 , 调用start0()
二、run()方法原理解读
源码在Thread.java中的746行左右。
/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
* @see #Thread(ThreadGroup, Runnable, String)
*/
@Override
public void run() {
if (target != null) {
target.run();
}
}
可以看到run()方法就是一个普普通通的方法,和我们自己写的普通方法没有区别,所以要想启动线程,不能调用run()方法,来间接的调用run()方法。
常见面试题
答:会抛出异常,在start()方法最开始的时候就会对当前状态进行检查,如果不符合规定,也就是说已经执行了start()方法,就会抛出异常。
答:调用start()方法才是真正意义上的启动线程,它会去经历线程的各个生命周期。而如果调用run方法,它就是一个普通方法,也不会去用子线程去调用。