1. 程式人生 > 其它 >Java執行緒基礎及多執行緒的實現

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());
    }
}