1. 程式人生 > 實用技巧 >多執行緒概述

多執行緒概述

概述

多執行緒(multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。

程序:執行程式一次的執行過程,動態的,由系統資源分配的單位。

執行緒:是cpu排程和執行的單位。

程序包括多個執行緒,至少有一個執行緒。

真正的多執行緒是有多個cpu,即多核。

模擬出來的多執行緒是一個cpu,在一個時間點只能執行一個程式碼,因為切換的很快,所以就有了同時執行的錯覺。

模型圖片

使用方法

Thread

  • 繼承Thread
  • 覆寫run方法
  • 建立物件
  • 呼叫start方法

Runnable

  • 介面Runnable
  • 覆寫run方法
  • 建立物件
  • 建立Thread物件,將上一個物件傳入,呼叫start方法

Callable

  • 介面Callable
  • 覆寫call方法,相當於run方法
  • 建立物件
  • 建立執行服務 Executors.newFixedThreadPool(3);
  • 提交執行 ser.submit(t1);
  • 獲取結果 r1.get();
  • 關閉服務 ser.shutdownNow();

例項

Thread

/**
 * 多執行緒 第一種 通過Thread實現
 */
public class ThreadDemo01 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我在看程式碼--"+i);
        }
    }
    public static void main(String[] args) {
        ThreadDemo01 t1 = new ThreadDemo01();
//        普通的呼叫方法啟動,按照順序執行
//        t1.run();
        t1.start();    //正確的執行緒啟動,不一定立即啟動,等待cpu排程
        for (int i = 0; i < 100; i++) {
            System.out.println("我在學習--"+i);
        }
    }
}

Runnable

public class RunnableDemo01 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我是子執行緒--"+i);
        }
    }

    public static void main(String[] args) {
        RunnableDemo01 runnable = new RunnableDemo01();
        Thread thread = new Thread(runnable);
        thread.start();
        for (int i = 0; i < 100; i++) {
            System.out.println("我是主執行緒--"+i);
        }
    }
}

Callable

/**
 * 通過Callable 實現多執行緒
 * 主要環節在四個註釋的地方
 */
public class CallableDemo01 implements Callable<Boolean> {
    private String name;
    public CallableDemo01(String name) {
        this.name = name;
    }
    @Override
    public Boolean call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.println("我在看"+name+"--"+i);
        }
        return true;
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableDemo01 t1 = new CallableDemo01("淘寶");
        CallableDemo01 t2 = new CallableDemo01("京東");
        CallableDemo01 t3 = new CallableDemo01("蘇寧易購");
        //建立執行服務
        ExecutorService ser = Executors.newFixedThreadPool(3);
        //提交執行
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);
//        獲取結果
        Boolean res1 = r1.get();
        Boolean res2 = r2.get();
        Boolean res3 = r3.get();
        //關閉服務
        ser.shutdownNow();

        for (int i = 0; i < 100; i++) {
            System.out.println("我正在看著你們--"+i);
        }
    }
}

一句話

把一個任務交給多個執行緒來執行,就好比田徑場分成1,2,3...等跑道,具有通用性。