大年初二,你們新年快樂,我又開始碼字了。寫這篇文章,源於在家和基友交流的時候,基友問到了,我猛然發現還真是這麼回事,多線程啓動調用的都是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