Java執行緒基礎及多執行緒的實現
一、進程和執行緒
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());
}
}