日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程(08):Executor线程池框架

發(fā)布時間:2025/3/16 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程(08):Executor线程池框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、Executor框架簡介

1、基礎簡介

Executor系統中,將線程任務提交和任務執(zhí)行進行了解耦的設計,Executor有各種功能強大的實現類,提供便捷方式來提交任務并且獲取任務執(zhí)行結果,封裝了任務執(zhí)行的過程,不再需要Thread().start()方式,顯式創(chuàng)建線程并關聯執(zhí)行任務。

2、調度模型

線程被一對一映射為服務所在操作系統線程,啟動時會創(chuàng)建一個操作系統線程;當該線程終止時,這個操作系統線程也會被回收。

3、核心API結構

Executor框架包含的核心接口和主要的實現類如下圖所示:

線程池任務:核心接口:Runnable、Callable接口和接口實現類;

任務的結果:接口Future和實現類FutureTask;

任務的執(zhí)行:核心接口Executor和ExecutorService接口。在Executor框架中有兩個核心類實現了ExecutorService接口,ThreadPoolExecutor和ScheduledThreadPoolExecutor。

二、用法案例

1、API基礎

ThreadPoolExecutor基礎構造

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {} 參數名說明
corePoolSize線程池的核心大小,隊列沒滿時,線程最大并發(fā)數
maximumPoolSize最大線程池大小,隊列滿后線程能夠容忍的最大并發(fā)數
keepAliveTime空閑線程等待回收的時間限制
unitkeepAliveTime時間單位
workQueue阻塞的隊列類型
threadFactory創(chuàng)建線程的工廠,一般用默認即可
handler超出工作隊列和線程池時,任務會默認拋出異常

2、初始化方法

ExecutorService :Executors.newFixedThreadPool(); ExecutorService :Executors.newSingleThreadExecutor(); ExecutorService :Executors.newCachedThreadPool();ThreadPoolExecutor :new ThreadPoolExecutor() ;

通常情況下,線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣的處理方式更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。

3、基礎案例

package com.multy.thread.block08executor; import java.util.concurrent.*;public class Executor01 {// 定義線程池private static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3,10,5000,TimeUnit.SECONDS,new SynchronousQueue<>(),Executors.defaultThreadFactory(),new ExeHandler());public static void main(String[] args) {for (int i = 0 ; i < 100 ; i++){poolExecutor.execute(new PoolTask(i));//帶返回值:poolExecutor.submit(new PoolTask(i));}} } // 定義線程池任務 class PoolTask implements Runnable {private int numParam;public PoolTask (int numParam) {this.numParam = numParam;}@Overridepublic void run() {try {System.out.println("PoolTask "+ numParam+" begin...");Thread.sleep(5000);} catch (Exception e) {e.printStackTrace();}}public int getNumParam() {return numParam;}public void setNumParam(int numParam) {this.numParam = numParam;} } // 定義異常處理 class ExeHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) {System.out.println("ExeHandler "+executor.getCorePoolSize());executor.shutdown();} }

流程分析

  • 線程池中線程數小于corePoolSize時,新任務將創(chuàng)建一個新線程執(zhí)行任務,不論此時線程池中存在空閑線程;
  • 線程池中線程數達到corePoolSize時,新任務將被放入workQueue中,等待線程池中任務調度執(zhí)行;
  • 當workQueue已滿,且maximumPoolSize>corePoolSize時,新任務會創(chuàng)建新線程執(zhí)行任務;
  • 當workQueue已滿,且提交任務數超過maximumPoolSize,任務由RejectedExecutionHandler處理;
  • 當線程池中線程數超過corePoolSize,且超過這部分的空閑時間達到keepAliveTime時,回收該線程;
  • 如果設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize范圍內的線程空閑時間達到keepAliveTime也將回收;

三、線程池應用

應用場景:批量賬戶和密碼的校驗任務,在實際的業(yè)務中算比較常見的,通過初始化線程池,把任務提交執(zhí)行,最后拿到處理結果,這就是線程池使用的核心思想:節(jié)省資源提升效率。

public class Executor02 {public static void main(String[] args) {// 初始化校驗任務List<CheckTask> checkTaskList = new ArrayList<>() ;initList(checkTaskList);// 定義線程池ExecutorService executorService ;if (checkTaskList.size() < 10){executorService = Executors.newFixedThreadPool(checkTaskList.size());}else{executorService = Executors.newFixedThreadPool(10);}// 批量處理List<Future<Boolean>> results = new ArrayList<>() ;try {results = executorService.invokeAll(checkTaskList);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 查看結果for (Future<Boolean> result : results){try {System.out.println(result.get());// System.out.println(result.get(10000,TimeUnit.SECONDS));} catch (Exception e) {e.printStackTrace() ;}}// 關閉線程池executorService.shutdownNow();}private static void initList (List<CheckTask> checkTaskList){checkTaskList.add(new CheckTask("root","123")) ;checkTaskList.add(new CheckTask("root1","1234")) ;checkTaskList.add(new CheckTask("root2","1235")) ;} } // 校驗任務 class CheckTask implements Callable<Boolean> {private String userName ;private String passWord ;public CheckTask(String userName, String passWord) {this.userName = userName;this.passWord = passWord;}@Overridepublic Boolean call() throws Exception {// 校驗賬戶+密碼if (userName.equals("root") && passWord.equals("123")){return Boolean.TRUE ;}return Boolean.FALSE ;} }

線程池主要用來解決線程生命周期開銷問題和資源不足問題,通過線程池對多個任務線程重復使用,線程創(chuàng)建也被分攤到多個任務上,多數任務提交就有空閑的線程可以使用,所以消除線程頻繁創(chuàng)建帶來的開銷。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent

推薦閱讀:Java并發(fā)編程

序號文章標題
01Java并發(fā):線程的創(chuàng)建方式,狀態(tài)周期管理
02Java并發(fā):線程核心機制,基礎概念擴展
03Java并發(fā):多線程并發(fā)訪問,同步控制
04Java并發(fā):線程間通信,等待/通知機制
05Java并發(fā):悲觀鎖和樂觀鎖機制
06Java并發(fā):Lock機制下API用法詳解
07Java并發(fā):Fork/Join框架機制詳解

總結

以上是生活随笔為你收集整理的Java并发编程(08):Executor线程池框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。