多執行緒概述
阿新 • • 發佈:2020-10-04
概述
多執行緒(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...等跑道,具有通用性。