java 多執行緒(一)
阿新 • • 發佈:2020-10-16
介紹
並行:一起行走,在一段時間內發生。
併發:同時發生,在某一刻時間完成。
程序:
一個程序也即一個任務
window和linux都是多工作業系統
程序與程序之間是相互獨立的
執行緒:
一個程序可以有多個執行緒,至少有一個執行緒
一個執行緒代表時間上的線性順序執行
執行緒是CPU劃分資源的最小單位(時間片和記憶體)
一個程序下的執行緒可以資源共享
單核:cpu是通過劃分時間片來實現多執行緒,實際上是並行
多核:cpu可以併發實現多執行緒
對於程式設計師來說,Java平臺和作業系統遮蔽了單核與多核問題。
多執行緒程式設計,一般來說解決兩個問題:速度和設計可管理性。方法是併發(或者在單核cpu上通過並行模擬)實現,所以也稱為併發程式設計,引發的問題稱為併發問題。
(1)更快的執行
將一個程式分為多個片段,分別執行。
多核:web伺服器常見,實際上現在一般的電腦都是多核了。併發執行,理所當然的更快了。
單核:一般來說,這種情況下任務整體的順序執行應該要快於分片的並行執行,因為需要考慮到上下文切換的消耗。但如果任務中包含阻塞情況,通常是I/O,而導致程式停止下來等待外部條件的變化,那麼多執行緒就會提高速度。
事實上,從效能角度來看,沒有任務會阻塞,那麼在單處理器上使用多執行緒就沒有任何意義。(但目前多核更常見)
(2)設計可管理性
GUI和WEB環境(比如Servlet)
建立
1、繼承Thread類
public class demo01 { public static void main(String[] args) { Dog dog = new Dog("小白"); Dog dog2 = new Dog("小黑"); dog.start(); dog2.start(); } } class Dog extends Thread{ int count = 0; String name; public Dog(){} public Dog(String name){this.name = name;} @Override public void run(){ while(++count<101) { System.out.println(name+"跑了:" +count + "米"); } } }
2、實現Runnable介面
public class demo02 { public static void main(String[] args) { Cat cat1 = new Cat("小紅"); Cat cat2 = new Cat("小綠"); Thread t1 = new Thread(cat1); Thread t2 = new Thread(cat2); t1.start(); t2.start(); } } class Cat implements Runnable{ int count = 0; String name; public Cat(){} public Cat(String name){this.name = name;} @Override public void run(){ while(++count<101) { System.out.println(name+"跑了:" +count + "米"); } } }
3、執行器Executor
public class Test03 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Cat("小紅"));
executorService.execute(new Cat("小綠"));
executorService.shutdown();
}
}