了解run start 的区别首先需要了解Thread类
start方法:
public synchronized void start() {
/**
* threadStatus 线程只能启动一次
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/*
* 加入线程组
*/
group.add(this);
boolean started = false;
try {
//开启线程 start0() 是一个nactive方法调用底层代码开启线程
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 方法:
//start0 被声明为native 调用底层代码,也就是说只有调用了start0 这个方法才会开启一个新的线程
private native void start0();
run方法:
//run 方法中并未调用start0 因此并未开启新的线程,只相当于普通的方法调用,即调用target的run方法
@Override
public void run() {
if (target != null) {
target.run();
}
}
//target 可查看Thread的构造函数
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
启动线程:
public class TestStartRun {
public static void main(String[] args) {
Thread t = createThread();
//t.run();
//t.start();
System.out.println("Thread"+Thread.currentThread());
}
public static Thread createThread(){
Thread t = new Thread(){
@Override
public void run() {
System.out.println("Thread"+Thread.currentThread());
}
};
return t;
}
调用:t.run();
ThreadThread[main,5,main]
ThreadThread[main,5,main]
调用:t.start();
ThreadThread[main,5,main]
ThreadThread[Thread-0,5,main]
总结:run方法相当于简单的方法调用并没有开启一个新的线程,start方法,相当于调用start0(),调用底层代码去开启线程