Java多线程与并发-8.2 线程的start和run的区别

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,
在这里插入图片描述
这个过程用图表示如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tanwenfang/article/details/92384531