1. 程式人生 > >(Java多執行緒系列九)執行緒池

(Java多執行緒系列九)執行緒池

執行緒池

1、什麼是執行緒池

執行緒池是指在初始化一個多執行緒應用程式過程中建立一個執行緒集合,然後在需要執行新的任務時重用這些執行緒而不是新建一個執行緒。執行緒池中執行緒的數量通常取決於可用記憶體數量和應用程式的需求。執行緒池中的每個執行緒都有被分配一個任務,一旦任務已經完成了,執行緒回到池子中並等待下一次分配任務。

2、執行緒池的作用

①執行緒池改進了一個應用程式的響應時間。由於執行緒池中的執行緒已經準備好且等待被分配任務,應用程式可以直接拿來使用而不用新建一個執行緒。

②執行緒池為每個短生存週期任務建立一個完整的執行緒的,並可以在任務完成後回收資源。

③執行緒池根據當前在系統中執行的程序來優化執行緒時間片。

④執行緒池允許我們開啟多個任務而不用為每個執行緒設定屬性。

3、Java提供的四種執行緒池

3.1、newCachedThreadPool

建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。

public class CachedThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "=====" + index);
                }
            });
        }
    }

}
3.2、newFixedThreadPool

建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。

public class FixedThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "=====" + index);
            });
        }
    }
}

3.3、newScheduledThreadPool

建立一個定長執行緒池,支援定時及週期性任務執行。

public class ScheduledThreadPoolDemo {

    public static void main(String[] args) {
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
        for (int i = 1; i <= 10; i++) {
            threadPool.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + ":延遲3秒列印log");
                }
            }, 3, TimeUnit.SECONDS);
        }
    }

}
3.4、newSingleThreadExecutor

建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序執行。

public class SingleThreadExecutorDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "===" + index);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

原始碼地