1. 程式人生 > >多執行緒:Executor、Sleep、Deamon、Yeild

多執行緒:Executor、Sleep、Deamon、Yeild

Executor

 

Executor是介面,Executors是工廠類!

Executor 管理多個非同步任務的執行,而無需程式設計師顯式地管理執行緒的生命週期。這裡的非同步是指多個任務的執行互不干擾,不需要進行同步操作。

主要有三種 Executor:

  • CachedThreadPool:一個任務建立一個執行緒;
  • FixedThreadPool:所有任務只能使用固定大小的執行緒;
  • SingleThreadExecutor:相當於大小為 1 的 FixedThreadPool。
public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    for (int i = 0; i < 5; i++) {
        executorService.execute(new MyRunnable());
    }
    executorService.shutdown();
}

 

Daemon

守護執行緒是程式執行時在後臺提供服務的執行緒,不屬於程式中不可或缺的部分。

當所有非守護執行緒結束時,程式也就終止,同時會殺死所有守護執行緒。

main() 屬於非守護執行緒。

使用 setDaemon() 方法將一個執行緒設定為守護執行緒。

public static void main(String[] args) {
    Thread thread = new Thread(new MyRunnable());
    thread.setDaemon(true);
}

sleep()

Thread.sleep(millisec) 方法會休眠當前正在執行的執行緒,millisec 單位為毫秒。

sleep() 可能會丟擲 InterruptedException,因為異常不能跨執行緒傳播回 main() 中,因此必須在本地進行處理。執行緒中丟擲的其它異常也同樣需要在本地進行處理。

public void run() {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

yield()

對靜態方法 Thread.yield() 的呼叫聲明瞭當前執行緒已經完成了生命週期中最重要的部分,可以切換給其它執行緒來執行。該方法只是對執行緒排程器的一個建議,而且也只是建議具有相同或大於的優先順序的其它執行緒可以執行。

public void run() {
    Thread.yield();
}