Thread中的start和run方法的区别就是:
- 调用start()方法会创建一个新的子线程并启动
- run()方法只是Thread的一个普通方法调用
下面我们来验证一下。
如下代码,先使用run()方法:
package thread;
public class ThreadTest {
private static void attack() {
System.out.println("Fight");
System.out.println("Current thread is:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
attack();
}
};
System.out.println("Current main thread is:" + Thread.currentThread().getName());
t.run(); // run()方法,会沿用主线程
}
}
输出结果为:
Current main thread is:main
Fight
Current thread is:main
然后使用start()方法:
package thread;
public class ThreadTest {
private static void attack() {
System.out.println("Fight");
System.out.println("Current thread is:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
attack();
}
};
System.out.println("Current main thread is:" + Thread.currentThread().getName());
t.start(); // 会创建新的线程
}
}
输出结果为:
Current main thread is:main
Fight
Current thread is:Thread-0
为什么使用run和start的不同结果可以知道,start会创建一个新的线程,而run不会,它只是沿用主线程而已。
我们也可以跟一下源码看看start方法为什么会创建新线程。
进入start()的源码,如下:
然后看start0():
然后登录:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/去查询外部的非Java源码,如下:
点击browse,因为Thread.class位于java.lang的目录下,所以我们进入/src/share/native/java/lang目录,找到Thread.c文件
打开Thread.c文件,搜索“start0”,
然后我们去看jvm的源码,退回到http://hg.openjdk.java.net/jdk8u/这个目录,点击hotspot,
然后点击browse,
然后进入/src/share/vm/prims目录,找到jvm.cpp文件,Java用到的一些原生方法都在里面,
打开这个文件,搜索JVM_StartThread,
进入thread_entry,
这个过程用图表示如下: