日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

發(fā)布時(shí)間:2025/6/17 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、ThreadPoolExecutor 構(gòu)造參數(shù)
  • 二、newCachedThreadPool 參數(shù)分析
  • 三、newFixedThreadPool 參數(shù)分析
  • 四、newSingleThreadExecutor 參數(shù)分析

前言

在上一篇博客 【Java 并發(fā)編程】線程池機(jī)制 ( 線程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor ) 使用了 333 種類(lèi)型的線程池 , 333 種線程池都使用了 ThreadPoolExecutor , 該類(lèi)時(shí)線程池的核心 ;

本篇博客中分析這 333 種線程池 ;





一、ThreadPoolExecutor 構(gòu)造參數(shù)



ThreadPoolExecutor 是線程池中最核心的類(lèi) , 其構(gòu)造函數(shù)如下 :

public ThreadPoolExecutor(int corePoolSize, // 核心線程數(shù) , 這些線程基本不會(huì)被銷(xiāo)毀int maximumPoolSize, // 最大線程數(shù) , 線程池能創(chuàng)建的最大線程數(shù)量long keepAliveTime, // 空閑情況下 , 非核心線程存活時(shí)間TimeUnit unit, // 空閑時(shí)間單位BlockingQueue<Runnable> workQueue,// 任務(wù)的阻塞隊(duì)列ThreadFactory threadFactory, // 創(chuàng)建線程的工廠類(lèi)RejectedExecutionHandler handler) // 拒絕策略

int corePoolSize 核心線程數(shù) , 這些線程基本不會(huì)被銷(xiāo)毀 ;

int maximumPoolSize 最大線程數(shù) , 線程池能創(chuàng)建的最大線程數(shù)量 , 包括 核心線程 + 非核心線程 ;

long keepAliveTime 空閑情況下 , 非核心線程存活時(shí)間 ;

TimeUnit unit 空閑時(shí)間單位 ;

BlockingQueue<Runnable> workQueue 任務(wù)的阻塞隊(duì)列 , 任務(wù)設(shè)置到線程池后 , 在該隊(duì)列中排隊(duì)等待執(zhí)行 ;

ThreadFactory threadFactory 創(chuàng)建線程的工廠類(lèi) ;

RejectedExecutionHandler handler 拒絕策略 , 如果線程池已滿 , 如果再放入新的任務(wù)后的拒絕策略





二、newCachedThreadPool 參數(shù)分析



ExecutorService executorService1 = Executors.newCachedThreadPool(); 創(chuàng)建線程池代碼如下 :

public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}

分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :

核心線程數(shù) 000 , 沒(méi)有核心線程 ;

最大線程數(shù) Integer.MAX_VALUE , 值為 231?12^{31} - 1231?1 , 這些線程都是非核心線程 , 是無(wú)限大的 ; 注意這里有 OOM 風(fēng)險(xiǎn) ;

線程的存活時(shí)間 606060 秒 ;

使用的等待隊(duì)列是 SynchronousQueue<Runnable> 隊(duì)列 ;


SynchronousQueue 隊(duì)列不存儲(chǔ)元素 , 后一個(gè) Runnable 任務(wù)入隊(duì) , 必須等到前一個(gè)任務(wù)執(zhí)行完畢才可以 , 否則會(huì)一直阻塞等待 ;


使用該線程池 , 如果執(zhí)行 100000100000100000 個(gè) Runnable 任務(wù) , 則會(huì)創(chuàng)建 100000100000100000 個(gè)線程 , 與 【Java 并發(fā)編程】線程池機(jī)制 ( 測(cè)試線程開(kāi)銷(xiāo) | 啟動(dòng)線程分析 | 用戶態(tài) | 內(nèi)核態(tài) | 用戶線程 | 內(nèi)核線程 | 輕量級(jí)進(jìn)程 ) 一、測(cè)試線程開(kāi)銷(xiāo) 1、正常測(cè)試 章節(jié)測(cè)試 ;

  • 首次創(chuàng)建 100000100000100000 線程 , 性能基本相同 , 只是添加了一個(gè)線程存活時(shí)間 ;
  • 如果再次創(chuàng)建 100000100000100000 線程 , 此時(shí)線程池中的線程如果執(zhí)行完畢 , 可以復(fù)用之前創(chuàng)建的 100000100000100000 線程池 , 不用重新創(chuàng)建線程 ; 前提是期間沒(méi)有間斷 , 如果線程間斷超過(guò)了 " 非工作線程存活時(shí)間 " , 這些線程就會(huì)被銷(xiāo)毀 ;




三、newFixedThreadPool 參數(shù)分析



ExecutorService executorService2 = Executors.newFixedThreadPool(10); 創(chuàng)建線程池代碼如下 :

public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}

分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :

核心線程數(shù)是 nThreads , 這是傳入的參數(shù) ;

最大線程數(shù) nThreads , 核心線程數(shù)是 nThreads , 所有的線程都是核心線程 ;

非核心線程的存活時(shí)間 000 毫秒 ; 由于所有線程都是核心線程 , 設(shè)置非核心線程存貨事件意義不大 ;

使用的等待隊(duì)列是 LinkedBlockingQueue<Runnable> 隊(duì)列 ;


LinkedBlockingQueue 隊(duì)列是基于鏈表的阻塞隊(duì)列 , 該隊(duì)列吞吐量高于 ArrayBlockingQueue 隊(duì)列 , 低于 SynchronousQueue 隊(duì)列 ;


假設(shè)核心線程數(shù)為 101010 , 有 100100100 個(gè)任務(wù)需要執(zhí)行 ;

執(zhí)行 100100100 個(gè) Runnable 任務(wù) , 如果 101010 個(gè)核心線程沒(méi)有滿 , 則將任務(wù)提交給核心線程執(zhí)行 ; 如果核心線程都滿了 , 則將 Runnable 任務(wù)放到 LinkedBlockingQueue<Runnable> 等待隊(duì)列 , 假如該等待隊(duì)列中任務(wù)也滿了 , 則需要執(zhí)行 RejectedExecutionHandler handler 拒絕策略 ;

該拒絕策略默認(rèn)是 defaultHandler ;

private static final RejectedExecutionHandler defaultHandler =new AbortPolicy();



四、newSingleThreadExecutor 參數(shù)分析



ExecutorService executorService3 = Executors.newSingleThreadExecutor(); 創(chuàng)建線程池代碼如下 :

public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}

分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :

核心線程數(shù)是 111 , 只有 111 個(gè)核心線程 ;

最大線程數(shù) 111 , 核心線程數(shù)是 111 , 所有的線程都是核心線程 ;

非核心線程的存活時(shí)間 000 毫秒 ; 由于所有線程都是核心線程 , 設(shè)置非核心線程存貨事件意義不大 ;

使用的等待隊(duì)列是 LinkedBlockingQueue<Runnable> 隊(duì)列 ;


LinkedBlockingQueue 隊(duì)列是基于鏈表的阻塞隊(duì)列 , 該隊(duì)列吞吐量高于 ArrayBlockingQueue 隊(duì)列 , 低于 SynchronousQueue 隊(duì)列 ;


整個(gè)線程池只有 111 個(gè)核心線程在工作 ; 100100100 個(gè)任務(wù)在 LinkedBlockingQueue<Runnable> 任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行 ;

總結(jié)

以上是生活随笔為你收集整理的【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。