1. 程式人生 > >原創】Java併發程式設計系列2:執行緒概念與基礎操作

原創】Java併發程式設計系列2:執行緒概念與基礎操作

## 【原創】Java併發程式設計系列2:執行緒概念與基礎操作 > 偉大的理想只有經過忘我的鬥爭和犧牲才能勝利實現。 本篇為【Dali王的技術部落格】Java併發程式設計系列第二篇,講講有關執行緒的那些事兒。主要內容是如下這些: - 執行緒概念 - 執行緒基礎操作 ### 執行緒概念 程序代表了執行中的程式,一個執行的Java程式就是一個程序。在Java中,當我們啟動main函式時就啟動了一個JVM的程序,而main函式所在的執行緒就是這個程序中的一個執行緒,稱為主執行緒。 程序和執行緒的關係如下圖所示: ![file](https://img2020.cnblogs.com/other/923731/202003/923731-20200321230306993-1934490457.jpg) 由上圖可以看出來,一個程序中有多個執行緒,多個執行緒共享程序的堆的方法區資源,但是每個執行緒有自己的程式計數器和棧區域。 ### 執行緒基礎操作 #### 執行緒建立與執行 Java中有三種執行緒建立方式,分別為:繼承Thread類並重寫run方法,實現Runnable介面的run方法,使用FutureTask方式。 先看繼承Thread方式的實現,程式碼示例如下: ```java:n public class ThreadDemo { public static class DemoThread extends Thread { @Override public void run() { System.out.println("this is a child thread."); } } public static void main(String[] args) { System.out.println("this is main thread.") DemoThread thread = new DemoThread(); thread.start(); } } ``` 上面程式碼中DemoThread類繼承了Thread類,並重寫了run方法。在main函式裡建立了一個DemoThread的例項,然後呼叫其start方法啟動了執行緒。 > tips:呼叫start方法後執行緒並沒有馬上執行,而是處於就緒狀態,也就是這個執行緒已經獲取了除CPU資源外的其他資源,等待獲取CPU資源後才會真正處於執行狀態。 使用繼承方式,好處在於通過this就可以獲取當前執行緒,缺點在於Java不支援多繼承,如果繼承了Thread類,那麼就不能再繼承其他類。而且任務與程式碼耦合嚴重,一個執行緒類只能執行一個任務,使用Runnable則沒有這個限制。 來看實現Runnable介面的run方法的方式,程式碼示例如下: ```java:n public class RunnableDemo { public static class DemoRunnable implements Runnable { @Override public void run() { System.out.println("this is a child thread."); } } public static void main(String[] args) { System.out.println("this is main thread."); DemoRunnable runnable = new DemoRunnable(); new Thread(runnable).start(); new Thread(runnable).start(); } } ``` 上面程式碼兩個執行緒共用一個Runnable邏輯,如果需要,可以給RunnableTask新增引數進行任務區分。在Java8中,可以使用Lambda表示式對上述程式碼進行簡化: ```java:n public static void main(String[] args) { System.out.println("this is main thread."); Thread t = new Thread(() -> System.out.println("this is child thread")); t.start(); } ``` 上面兩種方式都有一個缺點,就是任務沒有返回值,下面看第三種,使用FutureTask的方式。程式碼示例如下: ```java:n public class CallableDemo implements