Java執行緒基礎及多執行緒的實現
阿新 • • 發佈:2021-08-12
一、程序和執行緒
1、程序:正在執行的程式
是系統進行資源分配和呼叫的獨立單位
每一個程序都有它自己的記憶體空間和系統資源
2、執行緒是程序中的單個順序控制流,是一條執行路徑
單執行緒 即一個控制流,多執行緒即多個控制流
二、多執行緒的實現
1、繼承Thread實現:
-
定義一個類繼承Thread類
-
在類中重寫run()方法
-
建立類的物件
-
啟動執行緒
程式碼示例
public class ThreadDemo extends Thread{ @Override public void run() { for (int i = 1;i < 20;i++){ System.out.println(getName()+":"+i); } } public static void main(String[] args) { ThreadDemo threadDemo1 = new ThreadDemo(); ThreadDemo threadDemo2 = new ThreadDemo(); threadDemo1.setName("執行緒1"); threadDemo2.setName("執行緒2"); System.out.println(threadDemo1.getPriority()); System.out.println(threadDemo2.getPriority()); threadDemo2.setPriority(6); threadDemo1.start(); threadDemo2.start(); System.out.println(Thread.currentThread().getName()); } }
注意:
- run方法封裝執行緒執行的程式碼,直接呼叫,相當於普通的方法
- start啟動執行緒,然後由JVM呼叫此執行緒的run方法
獲取和設定執行緒名稱
利用getName()即可獲取到執行緒的名稱,未繼承Thread的使用Thread.currentThread().getName()獲取執行緒名稱
.setName("")可設定執行緒名稱
執行緒排程模型
模型分類
1、分時排程 所有執行緒輪流使用CPU的使用權,平均分配每個執行緒佔用CPU的時間片
2、搶佔排程 優先讓優先順序高的執行緒使用CPU,如果執行緒的優先順序相同會隨機選擇一個
Thread()類中獲取和設定優先順序的方法
- 獲取優先順序public final int getPriority()
- 設定優先順序public final void setPriority(int newPriority)
- Thread.MIN_PRIORITY 值為1
- Thread.MAX_PRIORITY 值為10
- ThreadDemo.NORM_PRIORITY 值為 5
- 執行緒優先順序高僅僅表示獲取CPU時間片的機率高,並不是每次都會優先執行
執行緒的生命週期
2、實現Runnable:
- 定義一個類實現Runnable介面
- 在類1中重寫run()方法
- 建立類1的物件
- 建立Threa類的物件,把類1物件作為構造方法的引數
- 啟動執行緒
程式碼示例
public class RunnableDemo implements Runnable {
@Override
public void run() {
for (int i = 1;i < 100;i++){
System.out.println(i);
}
}
public static void main(String[] args) {
RunnableDemo runnableDemo = new RunnableDemo();
Thread thread1 = new Thread(runnableDemo,"執行緒1");
Thread thread2 = new Thread(runnableDemo,"執行緒2");
thread1.start();
thread2.start();
}
}
與Threa相比,實現Rnunable的好處:
- 避免了Java單繼承額侷限性
- 適合多個相同程式的程式碼處理同一個資源的情況,把執行緒和程式的程式碼、資料有效分離,較好的體現了面向物件的思維
3、實現 Callable介面(Callable介面有返回值 Runnable介面無返回值),使用ExecutorService、Callable、Future實現有返回結果的多執行緒
示例程式碼
public class CallableDemo implements Callable {
//1)重寫抽象方法call方法
@Override
public Integer call() throws Exception {
int result = new Random().nextInt(100);
System.out.println("執行子執行緒完成某次計算,結果為"+result);
return result;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//2)建立Callable介面實現類物件
CallableDemo callableDemo = new CallableDemo();
//FutureTask實現了RunnableFuture介面,RunnableFuture繼承了Runnable介面,FutureTask介面就是Runnable介面的實現類
FutureTask<Integer> task = new FutureTask<>(callableDemo);
Thread thread1 = new Thread(task); //執行緒池:省去了建立執行緒、釋放執行緒的時間
//3)開啟新的執行緒
thread1.start();
System.out.println("result="+task.get());
}
}