你真的會創建一個線程嗎?


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

如何創建一個線程

Java線程類也是一個Object類,它的實例都繼承自java.lang.Thread或其子類。 可以用如下方式用java中創建一個線程:

Thread 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
l9Q0ET.png

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

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

總結

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

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

福利一:后端開發視頻教程

這些年整理的幾十套JAVA后端開發視頻教程,包含微服務,分布式,Spring Boot,Spring Cloud,設計模式,緩存,JVM調優,MYSQL,大型分布式電商項目實戰等多種內容,關注Nauyus立即回復【視頻教程】無套路獲取。

福利二:面試題打包下載

這些年整理的面試題資源匯總,包含求職指南,面試技巧,微軟,華為,阿里,百度等多家企業面試題匯總。 本部分還在持續整理中,可以持續關注。立即關注Nauyus回復【面試題】無套路獲取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM