成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說線程池的工作原理?

開發 前端
Spring 項目中,會使用代碼可讀性更高的 ThreadPoolTaskExecutor 來創建線程池,雖然它的底層也是通過 ThreadPoolExecutor 來實現的,但 ThreadPoolTaskExecutor 可讀性更高,因為它不需要在構造方法中設置參數,而是通過屬性設置的方式來設置參數的,所以可讀性更高。

線程池的底層是基于線程和任務隊列來實現的,創建線程池的創建方式通常有以下兩種:

  1. 普通 Java 項目,使用 ThreadPoolExecutor 來創建線程池,這點《阿里巴巴Java開發手冊》中也有說明,如下圖所示:

圖片圖片

  1. Spring 項目中,會使用代碼可讀性更高的 ThreadPoolTaskExecutor 來創建線程池,雖然它的底層也是通過 ThreadPoolExecutor 來實現的,但 ThreadPoolTaskExecutor 可讀性更高,因為它不需要在構造方法中設置參數,而是通過屬性設置的方式來設置參數的,所以可讀性更高。

Spring 內置的線程池 ThreadPoolTaskExecutor 的使用示例如下:

@Configuration
public class AsyncConfig {
    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心線程數
        executor.setCorePoolSize(5);
        // 最大線程數
        executor.setMaxPoolSize(10);
        // 隊列容量
        executor.setQueueCapacity(20);
        // 線程池維護線程所允許的空閑時間
        executor.setKeepAliveSeconds(60);
        // 線程池對拒絕任務(無線程可用)的處理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化
        executor.initialize();
        return executor;
    }
}

一、線程池工作流程

當有任務來了之后,線程池的執行流程是這樣的:

  1. 先判斷當前線程數是否大于核心線程數,如果結果為 false,則新建線程并執行任務。
  2. 如果大于核心線程數,則判斷任務隊列是否已滿,如果結果為 false,則把任務添加到任務隊列中等待線程執行。
  3. 如果任務隊列已滿,則判斷當前線程數量是否超過最大線程數,如果結果為 false,則新建線程執行此任務。
  4. 如果超過最大線程數,則將執行線程池的拒絕策略。

如下圖所示:

圖片圖片

二、拒絕策略

當線程池無法接受新任務時,會觸發拒絕策略,內置的拒絕策略有四種:

  1. AbortPolicy:默認策略,直接拋出 RejectedExecutionException 異常。
  2. CallerRunsPolicy:由調用者線程執行任務。
  3. DiscardPolicy:默默地丟棄任務,沒有任何異常拋出。
  4. DiscardOldestPolicy:嘗試拋棄隊列中最舊的任務,然后重新嘗試提交當前任務。

除了內置的拒絕策略之外,我們還可以設置自定義拒絕策略,它的實現如下:

import java.util.concurrent.RejectedExecutionHandler;  
import java.util.concurrent.ThreadPoolExecutor;  
  
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {  
  
    @Override  
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {  
        // 在這里處理拒絕的任務  
        System.err.println("任務被拒絕執行: " + r.toString());  
        // 可以選擇記錄日志、拋出自定義異常或采取其他措施  
        // 例如,可以將任務保存到某個隊列中,稍后再嘗試重新執行  
    }  
}

使用自定義拒絕策略:

import java.util.concurrent.ArrayBlockingQueue;  
import java.util.concurrent.ThreadPoolExecutor;  
import java.util.concurrent.TimeUnit;  
  
public class ThreadPoolDemo {  
  
    public static void main(String[] args) {  
        // 配置線程池參數  
        int corePoolSize = 5;  
        int maximumPoolSize = 10;  
        long keepAliveTime = 60L;  
        TimeUnit unit = TimeUnit.SECONDS;  
        int queueCapacity = 25;  
  
        // 創建一個阻塞隊列  
        ArrayBlockingQueue<Runnable> workQueue = 
            new ArrayBlockingQueue<>(queueCapacity);  
  
        // 創建 ThreadPoolExecutor 實例  
        ThreadPoolExecutor executor = new ThreadPoolExecutor(  
                corePoolSize,  
                maximumPoolSize,  
                keepAliveTime,  
                unit,  
                workQueue,  
                new CustomRejectedExecutionHandler() // 使用自定義的拒絕策略  
        );  
  
        // 提交任務  
        for (int i = 0; i < 50; i++) {  
            final int taskId = i;  
            executor.execute(() -> {  
                System.out.println("執行任務: " + taskId + " 由線程 " + Thread.currentThread().getName() + " 執行");  
                try {  
                    Thread.sleep(1000); // 模擬耗時任務  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            });  
        }  
  
        // 關閉線程池(這不會立即停止所有正在執行的任務)  
        executor.shutdown();  
    }  
}

課后反思

實際項目中線程池會使用哪種拒絕策略?為什么?線程池是通過什么機制來創建線程的?線程池創建線程時可以設置哪些屬性?

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2024-06-04 09:02:03

2024-09-12 08:35:06

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-16 00:00:01

JWT客戶端存儲加密令

2024-07-31 08:28:37

DMAIOMMap

2024-03-14 14:56:22

反射Java數據庫連接

2024-12-06 07:00:00

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-02-29 16:49:20

volatileJava并發編程

2024-08-29 16:30:27

2024-08-12 17:36:54

2025-02-28 00:00:00

2021-06-07 17:12:22

線程安全Atomic

2024-03-01 11:33:31

2024-12-04 14:45:14

零拷貝技術CPU 拷貝Zero-copy

2024-03-28 10:37:44

IoC依賴注入依賴查找
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区三区在线播放 | 亚洲精品乱 | 免费网站国产 | 久久久久国产精品一区二区 | 观看av| 亚洲视频中文字幕 | 欧美片网站免费 | 色综合久久久久 | 激情国产 | 欧美视频中文字幕 | 有码一区| 欧美综合一区二区 | 黄色欧美视频 | 国产福利在线 | 91原创视频| 久久一视频 | 男女羞羞视频免费 | 波多野结衣先锋影音 | 欧美三级电影在线播放 | 超碰在线人人 | 99精品国自产在线观看 | 亚洲成人免费视频在线 | 激情久久网| 欧美精品久久久久 | 久久精品女人天堂av | 精品一区二区在线看 | 在线观看特色大片免费网站 | 国产在线观 | 亚洲欧美日韩一区二区 | 国产精品99久久久久久宅男 | 在线中文视频 | 国产精品高潮呻吟久久 | 超碰最新在线 | 日本不卡一区二区三区在线观看 | 亚洲欧美在线视频 | 人人爽日日躁夜夜躁尤物 | 亚洲va欧美va天堂v国产综合 | 97影院在线午夜 | 亚洲一区二区三区免费 | 精品国产一区二区三区久久久蜜月 | 久久午夜国产精品www忘忧草 |