1. 程式人生 >實用技巧 >其它 >java建立執行緒池的幾種方式(程式碼)

java建立執行緒池的幾種方式(程式碼)



```java
package com.example.demo.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {

    public static void main(String[] args) {
//        cacheThreadPool();
//        fixTheadPoolTest();
//        singleTheadPoolTest();
//        scheduleThreadPool();
    }


    /**
     * 1.建立一個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會回收部分空閒(60秒不執行任務)的執行緒<br>
     * 2.當任務數增加時,此執行緒池又可以智慧的新增新執行緒來處理任務<br>
     * 3.此執行緒池不會對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說JVM)能夠建立的最大執行緒大小<br>
     */
    public static void cacheThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 10; i++) {
            final int ii = i;
            try {
                Thread.sleep(ii * 1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           cachedThreadPool.execute(()->System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行" + ii));
            
        }
    }


    /**
     * 1.建立固定大小的執行緒池。每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小<br>
     * 2.執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒<br>
     * 3.因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字,和執行緒名稱<br>
     */
    public static void fixTheadPoolTest() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            final int ii = i;
            fixedThreadPool.execute(() -> {
                System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行" + ii);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    /**
     *建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行
     */
    public static void singleTheadPoolTest() {
        ExecutorService pool = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int ii = i;
            pool.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "=>" + ii);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }


    /**
     * 建立一個定長執行緒池,支援定時及週期性任務執行。延遲執行
     */
    public static void scheduleThreadPool() {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

        Runnable r1 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:3秒後執行");
        scheduledThreadPool.schedule(r1, 3, TimeUnit.SECONDS);

        Runnable r2 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:延遲2秒後每3秒執行一次");
        scheduledThreadPool.scheduleAtFixedRate(r2, 10, 3, TimeUnit.SECONDS);

        Runnable r3 = () -> System.out.println("執行緒名稱:" + Thread.currentThread().getName() + ",執行:普通任務");
        for (int i = 0; i < 5; i++) {
            scheduledThreadPool.execute(r3);
        }
    }




}