1. 程式人生 > >你真的會建立一個執行緒嗎?

你真的會建立一個執行緒嗎?

在文章開始之前先看一個問題,下圖幾種建立執行緒方式分別是什麼,它們之間的區別和聯絡是什麼? 如果可以輕鬆回答,那麼本文對你來說過於基礎,不用往下看啦,如果還有所迷惑,那就和Nauyus一起復習下建立執行緒的幾種方式吧!

如何建立一個執行緒

Java執行緒類也是一個Object類,它的例項都繼承自java.lang.Thread或其子類。 可以用如下方式用java中建立一個執行緒:

Tread thread = new Thread();
thread.start();

但是這樣建立的執行緒會快速執行結束,因為執行緒所執行的內容是空的,如果需要執行緒執行自定義的程式碼, 有兩種方式可以實現,一種是繼承Thread類,覆寫run方法將執行緒執行內容放入run方法中,另一種是實現Runable介面,將實現Runable介面的類作為引數傳遞給Thread類。因為匿名內部類和Java8 Lambda的出現,這兩種方式又各有變體,但萬變不離其宗,下面我們來看一下。

繼承Thread類

第一種方法是繼承Thread類,用自定義的run方法覆寫父類方法實現傳遞執行緒執行程式碼:

public class MyThread extends Thread {
   @Override
   public void run(){
     System.out.println("MyThread running");
   }
}
MyThread myThread = new MyThread();
myThread.start();

繼承Thread類——匿名內部類寫法

對於那些只需例項化一次的程式碼如果每次都需要定義一個MyThread也是挺麻煩的,這就有了匿名內部類變體:

//匿名內部類
Thread thread = new Thread(){
   @Override
   public void run(){
     System.out.println("Thread Running");
   }
};
thread.start();

//還可以更簡化
new Thread(){
   @Override
   public void run(){
     System.out.println("Thread Running");
   }
}.start();

實現Runable介面

還有一種建立多執行緒的方法是實現Runable介面,將實現Runable介面的類作為引數傳遞給Thread類,從而做到傳遞執行緒要執行程式碼的目的:

public class MyRunnable implements Runnable {
   public void run(){
    System.out.println("MyRunnable running");
   }
}
Thread thread = new Thread(new MyRunnable());
thread.start();

實現Runable介面——匿名內部類

同樣,我們可以使用匿名內部類簡化程式碼:

//匿名內部類
Runnable myRunnable = new Runnable(){
   public void run(){
     System.out.println("Runnable running");
   }
}
Thread thread = new Thread(myRunnable);
thread.start();

//還可以更簡化
new Thread( new Runnable(){
    @Override
    public void run(){
        System.out.println("Runnable running");
    }
}).start();

實現Runable介面——Lambda表示式

好了到這裡程式碼已經很簡化了,但是我們再次看下這段程式碼:

l9Q0ET.png

其實除了System.out.println("Runnable running");是我們需要執行的執行緒體之外其他都是模版程式碼,那麼為什麼我們為了傳遞一行實際有用的程式碼要把整個類傳遞進去呢? Java8提出了函數語言程式設計思想,可以將一個函式作為引數直接傳遞給方法,並可以將函式使用Lambda表示式來簡化表達,使用Lambda表示式建立的執行緒如下:

new Thread(() -> {
    System.out.println("Thread Running");
}).start();

總結

下圖總結了建立執行緒的方式,當然,實際應用中我們更多的使用執行緒池來建立一個執行緒,但是也離不開這些基礎,更重要的是思想,好了關於執行緒池的部分我們以後文章再見。

感謝閱讀,原創不易,如有啟發,點個贊吧!這將是我寫作的最強動力!本文不同步釋出於不止於技術的技術公眾號 Nauyus ,主要分享一些程式語言,架構設計,思維認知類文章, 2019年12月起開啟周更模式,歡迎關注,共同學習成長!