目錄
多線程相信大家可能有一定的認知與瞭解,比方說百度雲下小視頻,或者迅雷下種子,一次性能開啓多個任務,這就是一個典型的多線程。
一、進程與線程的區別
比如電腦運行應用程序的例子,打開QQ,這就是一個進程,我們在任務管理器(按Ctrl+Alt+.)進入點擊任務管理器。可以看到,如圖,總而言之:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。
二、爲什麼要使用多線程?
舉個例子:這個時候有個小姐姐要去樓下拿快遞,但是她有20個快遞要拿,假設一次拿五個快遞,她就需要拿四次,但是這時小何出現了,和小姐姐一起去拿快遞,這時就只需要兩次即可完成!如圖:
從中我們得出了一個結論:小何是個直男,不會陪小姐姐一起休息照顧她。當然不是這樣。多線程之間互不干涉,互不影
響,即便是線程A掛掉,線程B也會繼續運行,這就是爲什麼需要使用多線程。那麼常見的應用場景當然就是羣發短信了,比如
公司要給十萬用戶發短信,不可能一個線程一次一次的發送,這樣效率太慢了,這次就需要用到多線程去處理!來提高效率!
三、常見創建線程的方式
這是一道面試時常見的問題。我們一般會說有兩種,其實是有三種,當然四種也行,嚴格意義上來說只有三種。那麼爲什
麼小何說能有四種呢?請聽小何一一道來!
3.1、繼承Thread類
當然繼承類使用的比較少,原因相信大家都知道,類只能繼承一個,接口可以實現多個。
class AThread extends Thread {
public void run() { System.out.println("Hello Word? No!IS Hello Thread!!!"); }
}
public class A {
public static void main(String[] args) { new AThread().start(); }
}
打印結果爲:
3.2、實現Runnable接口
實現接口是常用的,對比繼承Thread,優勢多在還能繼承一個類。
當然實現接口是沒有start方法的,只能直接調用run方法,那麼就不是一個新的線程了,所以我們在這裏new出一個線程把
BThread放入然後再調用線程的start方法。
注意:啓動一個線程 是調用start方法 不是run方法。 調用run方法相當於主線程執行。
class BThread implements Runnable {
public void run() { System.out.println("Hello Word? No!IS Hello BThread!!!"); }
}
public class B {
public static void main(String[] args) {
Thread thread = new Thread(new BThread());
thread.start();
}
}
打印結果爲:
3.3、匿名內部類
匿名內部類相信有經驗的開發者應該知道,這個在一些項目模式中不會常用,依項目類型與需求而定。
//使用匿名內部類方式創建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("HI");
}
});
thread.start();
當然也可以直接在創建後start,不建立Thread對象
3.4、匿名內部類(Lambda創建)
第四種其實只是基於第三種的優化,使用了Lambda而已,注意該種方式只存在於JDK1.8或以上:
//JDK1.8之後 Lambda創建
new Thread(() -> {
System.out.println("A");
}).start();
四、啓動線程方式以及優先級
Start方法代表啓動一個線程,run方法相當於調用,而不是啓動線程。 main方法與線程方法同時運行,main會優先運行,因爲是主線程。