前言
多線程(multithreading),是指從軟體或者硬體上實現多個線程並發執行的技術。具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶元級多處理或同時多線程處理器。在一個程序中,這些獨立運行的程序片段叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」 。

一、生活中多線程的例子
- 城市發展:
- 鄉村小道:可以理解為典型的單線程,當車流量較少時,可以正常同行,不會影響效率。

- 高速公路:當車流量大了之後,鄉村小路開始變得擁堵,人們為了解決這個問題,就拓寬馬路,增加車道,抽象的理解為,多線程同時工作。

- 實際生活中例子數不勝數,比如:吃飯時變玩手機邊吃飯,邊上廁所邊玩手機。
二、進程和線程
程序:
- 程序是一個指令序列。
- 程序是靜態的。
進程:
- 進程就是執行程序的一次性過程。相當於一整條高速公路。
- 一個線程可以包含多個線程,當然,最少有一個線程,不然這個進程毫無意義
線程:
- 線程相當於獨立的執行路徑。相當於高速公路的每一條車道。
- 在程序執行中,即使你沒有創建線程,也會有默認的線程,如:main,gc等。
- main() 函數 被稱為主線程,是整個程序的入口。
- 在一個線程當中,如果有多個進程,具體的調度是無法人為干預的,是由cpu來調度的。
- 多個線程對同一個資源進行操作時,可能會發生錯誤,需要加入並發控制。
上面都是一些理論的知識,有些枯燥,理解記憶即可。。
三、繼承Tread類
實現方式:
- 繼承Tread類
- 重寫run方法
- 創建實例調用start()方法
實現代碼案例:
/**
* 多線程的實現方式一 :繼承Tread類,並重寫run方法,創建實例調用start方法
*/
public class TestTread extends Thread{
//idea中快速重現父類方法的快捷鍵是 ctrl + o
@Override
public void run() {
System.out.println("我是一個線程呀~~~~");
}
public static void main(String[] args) {
//實例化線程實現類
TestTread testTread = new TestTread();
//使用start()方法啟動該線程,無需調用run方法,因為在線程中他會默認調用run()方法,也就是啟動後會自動執行run()方法
testTread.start();
}
}
執行結果如下:

四、實現Runnable介面
- 實現Runnable介面
- 重寫run()方法
- 創建Thread時作為參數傳入
- 用start方法
代碼實現案例:
/**
* 多線程的實現方式二 :實現Runnable介面,並重寫run方法,創建Thread時作為參數傳入,調用start方法
*/
public class TestRunnable implements Runnable{
public static void main(String[] args) {
//分開寫
TestRunnable testRunnable = new TestRunnable();
Thread tread = new Thread(testRunnable);
tread.start();
//簡寫
new Thread(new TestRunnable()).start();
}
//和Thread一樣,需要重寫run()方法
@Override
public void run() {
System.out.println("我也是一個線程呀~~~");
}
}
執行結果如下:

五、實現Callable介面
- 實現Callable介面
- 重寫call方法
- 必須定義返回值
- 拋出異常
- ExecutorService :不展開講,後面的文章會詳細介紹
- shutdown():停止接收新任務,原來的任務繼續執行
- shutdownNow():停止接收新任務,原來的任務停止執行
- awaitTermination(long timeOut, TimeUnit unit):當前線程阻塞
代碼實現案例:
/**
* 多線程的實現方式三:實現Callable介面,重寫call方法
* 需要有返回值
*/
public class TestCallable implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable testCallable = new TestCallable();
//創建執行服務,這是相當於線程池,本篇文章不展開講,後面會詳細介紹這幾個參數和使用方法
ExecutorService service = Executors.newFixedThreadPool(1);
//執行
Future<String> result = service.submit(testCallable);
//可獲取線程的返回值
String result1 = result.get();
System.out.println("我是線程的返回值:"+result1);
//停止線程
service.shutdownNow();
}
@Override
public String call() throws Exception {
System.out.println("我當然也是一個線程啦啦啦啦德瑪西亞~~~");
return "我是一個線程";
}
}
執行結果如下:

六、總結
- 線程只是實現Runnable或實現Callable介面,還可以繼承其他類。
- 這種方式下,多個線程可以共享一個target對象,非常適合多線程處理同一份資源的情形。
- 但是編程稍微複雜,如果需要訪問當前線程,必須調用Thread.currentThread()方法。下一篇詳解。
- 繼承Thread類的線程類不能再繼承其他父類(Java單繼承決定)。
- 註:一般推薦採用實現介面的方式來創建多線程,因為單繼承多實現,提高復用性!
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/276310.html