它们的区别从源码中很明显可以看出来。
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();
/* 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);
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 */
}
}
}
private native void start0();
这里直接就调用了native方法是真正的实现了线程,提交给了CPU进行处理
run方法
/* What will be run. */
private Runnable target;
...
@Override
public void run() {
if (target != null) {
target.run();
}
}
run方法只是执行了 线程创建时实现的run方法而已,其执行方法时所在的线程并没有变化,比如在MainThread中创建线程时,那么run方法也是在MainThread中执行的
下面用个例子验证一下
public class ThreadTest002 {
public static void main(String[] args) {
Thread thread01 = new Thread(new Thread02("C"));
Thread thread02 = new Thread(new Thread02("D"));
thread01.start();
thread02.run();
}
}
class Thread02 implements Runnable {
private String name;
public Thread02(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(name + "-" + "--" + Thread.currentThread().getName());
}
}
输出结果为:
D—main
C—Thread-0