> 本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、併發程式設計簡介 ## 1、基礎概念 - 程式 與計算機系統操作有關的計算機程式、規程、規則,以及可能有的檔案、文件及資料。 - 程序 程序是計算機中的程式,關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令、資料及其組織形式的描述,程序是程式的實體。 - 執行緒 執行緒是作業系統能夠進行運算排程的最小單位,包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。 - 順序程式設計 程式中的所有步驟在任意時刻只能執行一個步驟。程式設計中絕大部分場景都是基於順序程式設計。 - 併發程式設計 在一臺處理器上“同時”處理多個任務,並行處理程式中的複雜耗時任務。併發是在同一實體上的多個事件。多個事件在同一時間間隔發生。 ## 2、入門案例 ```java public class HelloThread { public static void main(String[] args) { System.out.println("Hello,Thread"); // 當前執行緒名稱 System.out.println(Thread.currentThread().getName()); // 執行緒系統的管理介面 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); long[] threadIds = threadMXBean.getAllThreadIds() ; for (long id : threadIds) { ThreadInfo threadInfo = threadMXBean.getThreadInfo(id) ; System.out.println(threadInfo.getThreadId()+ ":"+threadInfo.getThreadName()); } } } ``` 列印結果: ``` 5:Monitor Ctrl-Break 4:Signal Dispatcher 3:Finalizer 2:Reference Handler 1:main ``` 由此可知上述一段簡單的Java程式,不止一條main執行緒在執行。 # 二、執行緒建立方式 ## 1、繼承Thread類 Thread類的基礎結構: ```java class Thread implements Runnable ``` 這裡已經實現了Runnable介面。 ```java public class CreateThread01 { public static void main(String[] args) { // 呼叫方法 MyThread1 myThread1 = new MyThread1() ; myThread1.start(); } } class MyThread1 extends Thread { // 設定執行緒名稱 public MyThread1 (){ super("CicadaThread"); } @Override public void run() { System.out.println(Thread.currentThread().getName()); } } ``` ## 2、實現Runnable介面 如果建立的執行緒類已經存在父類,則不能再繼承Thread類,在Java中不允許多繼承,這時就可以實現Runnable介面。 ```java public class CreateThread02 { public static void main(String[] args) { Thread thread = new Thread(new MyThread2(),"MyThread2") ; thread.start(); } } class MyThread2 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+" run ..."); } } ``` ## 3、匿名內部類 在一個類裡面定義一個類,稱為內部類。內部類就相當於外部類的一個成員,可以把內部類看成一個整體。 ```java public class CreateThread03 { public static void main(String[] args) { //方式1 new Thread("ThreadName1") { public void run() { System.out.println("1:"+Thread.currentThread().getName()); }; }.start(); //方式2 new Thread(new Runnable() { public void run() { System.out.println("2:"+Thread.currentThread().getName()); } },"ThreadName2"){ // 這裡重寫了run方法 @Override public void run() { System.out.println("3:"+Thread.currentThread().getName()); } }.start(); } } ``` ## 4、返回值執行緒 顧名思義,該執行緒執行緒非同步執行後,可以返回執行緒的處理結果。 ```java public class CreateThread04 { public static void main(String[] args) throws Exception { MyThread4 myThread4 = new MyThread4(); Fu