1. 程式人生 > 實用技巧 >java 多執行緒(一)

java 多執行緒(一)

介紹

並行:一起行走,在一段時間內發生。
併發:同時發生,在某一刻時間完成。

程序:
一個程序也即一個任務
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();
    }
}