大年初二,你们新年快乐,我又开始码字了。写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为何没人掉用run呢?因而打开个人idea,翻一波代码,带你们一探究竟。java
咱们知道java有三种方式实现多线程,这里直接用继承的方式进行试验,其余方式同理。咱们要作的是首先声明一个线程。而后去调用,最终根据结果概括run和start的区别。
定义一个线程类。多线程
class MyThread extends Thread { private String title; public MyThread(String title) { this.title = title; } @Override public void run() { for(int x = 0; x < 5 ; x++) { System.out.println(this.title + "运行,x = " + x); } } }
在咱们的主类中,起三个线程,看看调用的结果。代码以下:jvm
public class ExtendsThread { public static void main(String[] args) { new MyThread("线程A").start(); new MyThread("线程B").start(); new MyThread("线程C").start(); } }
直接运行main方法。
观察结果咱们发现,三个线程随机交替执行,取决于cpu的调度。
咱们再使用run方法来进行调用,查看结果ide
public class ExtendsThread { public static void main(String[] args) { new MyThread("线程A").run(); new MyThread("线程B").run(); new MyThread("线程C").run(); } }
结果以下:
看到这里细心的小伙伴发现了,这个run方法好像是顺序执行的啊!
的确是的,run方法并不会实现多线程。而是顺序执行。那么为何会产生这样的结果呢?this
咱们发现run方法只是简单的调用了实现类的run。没有进行任何的多线程处理。idea
start方法就不同了。咱们能够看到关键的代码就是start0方法。var1理解为线程为启动,调用start0后,线程启动。继续追踪start0.
这个是一个使用jni的java本地方法,jvm根据不一样的平台,调度的线程方法不一样。
借用一张网上图,一目了然。
start() 方法调用 start0() 方法后,该线程并不必定会立马执行,只是将线程变成了可运行状态。具体何时执行,取决于 CPU ,由 CPU 统一调度。线程
Java 中实现真正的多线程是 start 中的 start0() 方法,run() 方法只是一个普通的方法。3d