Java併發程式設計(01):執行緒的建立方式,狀態週期管理
阿新 • • 發佈:2020-03-04
> 本文原始碼:[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