Java併發程式設計-執行緒基礎
阿新 • • 發佈:2020-10-10
![](https://img2020.cnblogs.com/other/2024393/202010/2024393-20201010143357917-1858024490.png)
# 1. 執行緒的建立
首先我們來複習我們學習 `java` 時接觸的執行緒建立,這也是面試的時候喜歡問的,有人說兩種也有人說三種四種等等,其實我們不能去死記硬背,而應該深入理解其中的原理,當我們理解後就會發現所謂的建立執行緒實質都是一樣的,在我們面試的過程中如果我們能從本質出發回答這樣的問題,那麼相信一定是個加分項!好了我們不多說了,開始今天的 `code` 之路
## 1.1 **繼承 Thread 類建立執行緒 ** ** * 這是我們最常見的建立執行緒的方式,通過繼承 `Thread` 類來重寫 `run` 方法,
程式碼如下: ``` java /** * 執行緒類 * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class ThreadDemo extends Thread { @Override public void run() { //執行緒執行內容 while (true){ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThredDemo 執行緒正在執行,執行緒名:"+ Thread.currentThread().getName()); } } } ``` 測試方法: ``` java @Test public void thread01(){ Thread thread = new ThreadDemo(); thread.setName("執行緒-1 "); thread.start(); while (true){ System.out.println("這是main主執行緒:" + Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 結果:
![](https://img2020.cnblogs.com/other/2024393/202010/2024393-20201010143358159-1609930394.png) > 繼承 `Thread` 的執行緒建立簡單,啟動時直接呼叫 `start` 方法,而不是直接呼叫 `run` 方法。直接呼叫 `run` 等於呼叫普通方法,並不是啟動執行緒 ## 1.2 **實現 Runnable 介面建立執行緒 ** ** * 上述方式我們是通過繼承來實現的,那麼在 `java` 中提供了 `Runnable` 介面,我們可以直接實現該介面,實現其中的 `run` 方法,這種方式可擴充套件性更高
程式碼如下: ``` java /** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class RunnableDemo implements Runnable { @Override public void run() { //執行緒執行內容 while (true){ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("RunnableDemo 執行緒正在執行,執行緒名:"+ Thread.currentThread().getName()); } } } ``` 測試程式碼: ``` java @Test public void runnableTest(){ // 本質還是 Thread ,這裡直接 new Thread 類,傳入 Runnable 實現類 Thread thread = new Thread(new RunnableDemo(),"runnable子執行緒 - 1"); //啟動執行緒 thread.start(); while (true){ System.out.println("這是main主執行緒:" + Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 執行結果:
![](https://img2020.cnblogs.com/other/2024393/202010/2024393-20201010143358405-843685203.png)
## 1.3 實現 Callable 介面建立執行緒
* 這種方式是通過 實現 `Callable` 介面,實現其中的 `call` 方法來實現執行緒,但是這種執行緒建立的方式是依賴於 ** **`**FutureTask **`**包裝器**來建立 `Thread` , 具體來看程式碼
程式碼如下:
``` java /** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class CallableDemo implements
## 1.1 **繼承 Thread 類建立執行緒 ** ** * 這是我們最常見的建立執行緒的方式,通過繼承 `Thread` 類來重寫 `run` 方法,
程式碼如下: ``` java /** * 執行緒類 * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class ThreadDemo extends Thread { @Override public void run() { //執行緒執行內容 while (true){ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThredDemo 執行緒正在執行,執行緒名:"+ Thread.currentThread().getName()); } } } ``` 測試方法: ``` java @Test public void thread01(){ Thread thread = new ThreadDemo(); thread.setName("執行緒-1 "); thread.start(); while (true){ System.out.println("這是main主執行緒:" + Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 結果:
![](https://img2020.cnblogs.com/other/2024393/202010/2024393-20201010143358159-1609930394.png) > 繼承 `Thread` 的執行緒建立簡單,啟動時直接呼叫 `start` 方法,而不是直接呼叫 `run` 方法。直接呼叫 `run` 等於呼叫普通方法,並不是啟動執行緒 ## 1.2 **實現 Runnable 介面建立執行緒 ** ** * 上述方式我們是通過繼承來實現的,那麼在 `java` 中提供了 `Runnable` 介面,我們可以直接實現該介面,實現其中的 `run` 方法,這種方式可擴充套件性更高
程式碼如下: ``` java /** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class RunnableDemo implements Runnable { @Override public void run() { //執行緒執行內容 while (true){ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("RunnableDemo 執行緒正在執行,執行緒名:"+ Thread.currentThread().getName()); } } } ``` 測試程式碼: ``` java @Test public void runnableTest(){ // 本質還是 Thread ,這裡直接 new Thread 類,傳入 Runnable 實現類 Thread thread = new Thread(new RunnableDemo(),"runnable子執行緒 - 1"); //啟動執行緒 thread.start(); while (true){ System.out.println("這是main主執行緒:" + Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 執行結果:
![](https://img2020.cnblogs.com/other/2024393/202010/2024393-20201010143358405-843685203.png)
## 1.3 實現 Callable 介面建立執行緒
* 這種方式是通過 實現 `Callable` 介面,實現其中的 `call` 方法來實現執行緒,但是這種執行緒建立的方式是依賴於 ** **`**FutureTask **`**包裝器**來建立 `Thread` , 具體來看程式碼
程式碼如下:
``` java /** * url: www.i-code.online * @author: anonyStar * @time: 2020/9/24 18:55 */ public class CallableDemo implements