Java教程——線程池和future

Future 詳解

1. Future 是什么?

Future 是 Java 中的一個接口(java.util.concurrent.Future),代表異步計算的未來結果。它允許你:

  • 提交任務后立即返回
  • 在需要時檢查任務是否完成
  • 獲取任務結果(完成后)
  • 取消任務
2. 怎么使用 Future?

通過線程池提交任務:

ExecutorService executor = Executors.newFixedThreadPool(2);// 提交 Callable 任務(有返回值)
Future<String> future = executor.submit(() -> {TimeUnit.SECONDS.sleep(2);return "任務完成";
});// 其他操作...
String result = future.get(); // 阻塞直到結果就緒
3. Future 的作用
  • 異步解耦:主線程不阻塞等待
  • 結果獲取:在需要時通過 get() 取結果
  • 任務控制:支持取消和超時
4. Future 和異步的聯系

Future 是 Java 中實現異步編程的核心工具

  • 提交任務即異步執行
  • Future 對象作為"憑證",后續憑此獲取結果
  • 典型工作流:
    主線程提交任務
    線程池異步執行
    返回 Future
    繼續其他操作
    future.get 取結果
5. 異步 vs 并發
異步并發
非阻塞調用多個任務同時推進
關注單任務的非阻塞性關注多任務管理
Future 是異步工具線程/線程池是并發基礎
:網絡IO不阻塞主線程:同時處理100個請求
6. Future 和線程的關系
  • 依賴關系:Future 需要線程池執行任務
  • 結果載體:線程池返回 Future 作為結果容器
  • 控制中介:通過 Future 控制任務狀態(如取消)
7. 復雜任務處理:Future 組合案例
ExecutorService executor = Executors.newFixedThreadPool(3);// 步驟1:獲取用戶數據(耗時2秒)
Future<String> userFuture = executor.submit(() -> {TimeUnit.SECONDS.sleep(2);return "用戶數據";
});// 步驟2:獲取訂單數據(依賴用戶數據)
Future<String> orderFuture = executor.submit(() -> {String user = userFuture.get(); // 阻塞等待前置任務return user + " + 訂單數據";
});// 步驟3:獲取推薦數據(獨立任務)
Future<String> recommendFuture = executor.submit(() -> {TimeUnit.SECONDS.sleep(1);return "推薦數據";
});// 組合最終結果
String result = orderFuture.get() + " | " + recommendFuture.get();
System.out.println("最終結果: " + result); // 用戶數據 + 訂單數據 | 推薦數據executor.shutdown();
代碼解析:
  1. 線程池管理:使用 3 線程池處理并發
  2. 任務依賴
    • orderFuture 依賴 userFuture.get() 阻塞等待
    • recommendFuture 獨立執行
  3. 結果合并
    用戶任務
    訂單任務
    推薦任務
    結果合并
  4. 總耗時 ≈ 最大路徑
    • 路徑A→B:2秒
    • 路徑C:1秒
    • 最終耗時 ≈ 2秒(非3秒)
執行流程:
timelinetitle 任務時間軸(單位:秒)section 線程1用戶任務 : 0 - 2訂單任務 : 2 - 2(瞬時完成)section 線程2空閑 : 0 - 1訂單等待 : 1 - 2section 線程3推薦任務 : 0 - 1

關鍵點:Future 適合簡單依賴,對于復雜依賴鏈建議使用 CompletableFuture(支持回調、鏈式操作)

總結

  • Future 本質:異步任務的結果容器
  • 核心價值:分離任務提交與結果獲取
  • 適用場景:IO密集型任務、并行計算、服務組合
  • 進階建議:Java 8+ 使用 CompletableFuture 增強異步編程能力

線程池深度解析

一、線程池是什么?

線程池(Thread Pool)是一種線程管理機制,它預先創建一組可復用的線程,通過任務隊列管理待執行任務。其核心組件包括:

任務隊列
線程集合
執行任務
任務提交
線程回收
二、線程池的作用
作用維度具體說明優勢對比
資源復用避免頻繁創建/銷毀線程創建線程成本:約1ms/次 vs 復用成本:≈0
流量控制通過隊列緩沖突發請求避免服務器過載崩潰
性能提升減少線程切換開銷實測:線程復用比新建快5-10倍
統一管理提供狀態監控/任務取消比單個線程更易監控控制
三、線程池 vs 線程的關系
維度線程池獨立線程
本質線程資源管理器執行的最小單位
生命周期長期駐留(可復用)執行完立即銷毀
關系比喻企業的人力資源部具體干活的員工
創建成本一次性創建多次使用每次任務都新建
使用場景高并發任務(1000+)簡單單次任務
四、線程池核心參數

Java中創建線程池的完整參數:

ThreadPoolExecutor(int corePoolSize,    // 常駐核心線程數int maximumPoolSize, // 最大線程數long keepAliveTime,  // 空閑線程存活時間TimeUnit unit,       // 時間單位BlockingQueue<Runnable> workQueue, // 任務隊列ThreadFactory threadFactory,       // 線程創建工廠RejectedExecutionHandler handler   // 拒絕策略
)
五、線程池執行流程
提交任務
核心線程
是否空閑?
立即執行
隊列是否
未滿?
任務入隊
能否創建
新線程?
創建臨時線程
執行拒絕策略
六、四種拒絕策略對比
策略類型觸發條件處理方式適用場景
AbortPolicy隊列和線程池全滿拋出RejectedException嚴格要求不丟任務
CallerRunsPolicy同上回退給提交者線程執行核心業務場景
DiscardPolicy同上靜默丟棄新任務日志采集等非關鍵任務
DiscardOldestPolicy同上丟棄隊首任務并重試實時性要求高場景
七、線程池使用黃金法則
  1. 嚴禁使用Executors快捷方法

    • 問題:newFixedThreadPool使用無界隊列 → 可能導致OOM
    • 正確:手動創建ThreadPoolExecutor
  2. 合理設置隊列容量

    • 計算型任務:隊列長度設為 2×核心線程數
    • IO密集型:可設置稍大(但需監控隊列堆積)
  3. 監控關鍵指標

    // 重要監控指標
    executor.getActiveCount();    // 活躍線程數
    executor.getQueue().size();   // 隊列積壓量
    executor.getCompletedTaskCount(); // 完成數量
    
  4. 線程池關閉姿勢

    executor.shutdown(); // 平緩關閉
    if(!executor.awaitTermination(60, SECONDS)) {executor.shutdownNow(); // 強制關閉
    }
    
八、實際應用場景
  1. Web服務器:Tomcat線程池(maxThreads=200 + acceptCount=100
  2. 大數據處理:Spark任務調度池
  3. 金融交易:獨立線程池處理不同優先級訂單
  4. 微服務架構:Hystrix線程池隔離不同服務調用

通過合理使用線程池,某電商系統性能對比:

指標未用線程池優化后線程池提升
QPS12005600367%
CPU波動20%-95%65%-75%更平穩
響應時間300±250ms50±15ms降83%

CompletableFuture 深度指南

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89741.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷P1351 [NOIP 2014 提高組] 聯合權值

洛谷P1351 [NOIP 2014 提高組] 聯合權值 洛谷題目傳送門 題目背景 NOIP2014 提高組 D1T2 題目描述 無向連通圖 G G G 有 n n n 個點&#xff0c; n ? 1 n-1 n?1 條邊。點從 1 1 1 到 n n n 依次編號,編號為 i i i 的點的權值為 W i W_i Wi?&#xff0c;每條邊的長…

Apache Doris Profile 深度解析:從獲取到分析,解鎖查詢性能優化密碼

在 Doris 數據庫中&#xff0c;高效的查詢性能是數據處理的關鍵。當我們遇到查詢緩慢、資源消耗異常等問題時&#xff0c;Doris 提供的 Profile 工具就如同一位 “性能偵探”&#xff0c;能幫我們抽絲剝繭&#xff0c;找到問題根源。今天&#xff0c;我們就來深入聊聊如何分析 …

系統架構師

硬件&#xff1a; 運算器&#xff1a;1&#xff09;算術運算 加減乘除 2&#xff09;邏輯運算并進行邏輯測試&#xff1a;與或非 組件功能&#xff1a;算術邏輯單元ALU :處理數據 實現對數據的算術運算和邏輯運算 累加寄存器AC 通用寄存器&#xff0c;alu提供工作區 暫存運算結…

Unity HDRP + Azure IoT 工業設備監控系統實例

Unity HDRP Azure IoT 工業設備監控系統實例 下面是一個完整的工業設備監控解決方案&#xff0c;結合Unity HDRP&#xff08;高清渲染管線&#xff09;的高質量可視化與Azure IoT的實時數據處理能力。 系統架構 #mermaid-svg-XJnD6acrBbtbqYHW {font-family:"trebuchet…

(超詳細)數據庫項目初體驗:使用C語言連接數據庫完成短地址服務(本地運行版)

數據庫項目初體驗&#xff1a;使用C語言連接數據庫完成短地址服務&#xff08;本地運行版&#xff09; 前言&#xff1a;初學者的思考 作為一個剛初學數據庫的小白并且在之前我的博客中我有嘗試使用C語言寫過一個短地址服務&#xff0c;但是使用C語言編寫的短地址服務只有短記…

mysql基礎(一)快速上手篇

連接mysql 使用命令行窗口連接mysql數據庫 語法&#xff1a;mysql –h主機名 –u用戶名 –p密碼 說明&#xff1a;-h參數指定數據庫ip&#xff0c;本地服務器可以用localhost&#xff0c;-u參數指定用戶名&#xff0c;-p參數指定用戶密碼。 注意&#xff1a;-p和密碼值之間…

IntelliJ IDEA 2025- 下載安裝教程圖文版詳細教程(附激活碼)

目錄 寫在前面 一、介紹 二、下載 三、安裝 &#x1f3c1; 寫在最后 寫在前面 > &#x1f680; 初學 Java&#xff1f;或者剛開始寫項目&#xff0c;不知道該選哪個 IDE&#xff1f; 本篇教程手把手教你安裝 IntelliJ IDEA —— JetBrains 出品的頂級 Java 開發環境&a…

數學經濟專業大學四年規劃

數學經濟專業結合了數學的邏輯嚴謹性和經濟學的現實應用性&#xff0c;為學生提供了強大的數理分析能力和經濟洞察力。該專業畢業生在金融科技、量化投資、商業分析等領域具有顯著優勢&#xff0c;尤其在數字經濟時代&#xff0c;這類復合型人才的需求量持續增長。一、數學經濟…

局域網打印機共享怎么設置?如何配置內網本地網絡打印機給異地電腦遠程連接使用打印?

打印機共享怎么設置&#xff1f;如何設置本地內網的網絡打印機共享給其他網絡下電腦連接打印&#xff1f;打印機設置使用以及異地使用打印都是大家比較關注的問題&#xff0c;下面詳細教程中分二步&#xff0c;先講局域網內的打印機共享&#xff0c;再進一步介紹內網打印機地址…

Rust異步爬蟲實現與優化

Rust 語言在爬蟲領域的應用相對較少&#xff0c;盡管 Rust 的 async/await 已穩定&#xff0c;但其與線程安全、Pin 等概念的結合仍較復雜&#xff0c;而爬蟲高度依賴并發處理&#xff0c;進一步提高了開發成本。這就導致了使用Rust語言爬蟲用的人很少。 下面是一個使用 Rust 編…

Electron 安全最佳實踐:構建安全的桌面應用

Electron 是一個流行的框架&#xff0c;允許開發者使用 Web 技術&#xff08;HTML、CSS、JavaScript&#xff09;構建跨平臺桌面應用。許多知名應用&#xff0c;如 VS Code、Slack 和 Discord&#xff0c;都基于 Electron 開發。然而&#xff0c;由于其結合了 Node.js&#xff…

MySQL 事務詳解:從基礎操作到隔離級別與 MVCC 原理

前言 首先從概念上進行理解什么是事務&#xff0c;以及事務的4大屬性&#xff0c;知道是什么還要知道為什么&#xff1f; 事務是如何進行操作的&#xff0c;最后在談事務的隔離性、隔離級別&#xff08;最重要但是也很難理解&#xff09;&#xff0c;理解隔離級別體現在哪里 …

【Unity 編輯器工具開發:GUILayout 與 EditorGUILayout 對比分析】

Unity 編輯器工具開發&#xff1a;GUILayout 與 EditorGUILayout 對比分析 一、核心區別對比 方面GUILayoutEditorGUILayout區別命名空間UnityEngineUnityEditorEditorGUILayout 僅限編輯器環境適用范圍游戲運行時 編輯器工具僅限編輯器工具運行時禁用 EditorGUILayout渲染管…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+jsp實現的個人財務管理系統,推薦!

摘 要 隨著軟件信息技術的興起&#xff0c;許多手工作業也升級為軟件管理數據&#xff0c;本次針對個人財務數據的管理&#xff0c;開發一款個人財務管理系統&#xff0c;該系統可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及…

Compose入門3 - 高仿小紅書 界面

使用compose 實現一個小紅書UI 界面&#xff0c;主要是為了鍛煉 使用compose布局的能力 demo地址&#xff1a;https://github.com/PangHaHa12138/ComposeDemo 先上demo 截圖 下面是完整的compose代碼 package com.example.test001import android.annotation.SuppressLint imp…

mybatis-plus json字段使用typeHandler自動轉換為List

mybatis-plus json字段使用typeHandler自動轉換為List mybatis-plus json字段使用typeHandler自動轉換為List 一、實現思路 1.配置mybatis配置&#xff0c;注入handlermybatis-plus:typeHandlersPackage: com.power.common.core.handler 2.字段頂部增加注解TableField(typeHand…

(C++)學生管理系統(測試2版)(map數組的應用)(string應用)(引用)(C++教學)(C++項目)

1. 頭文件與命名空間 #include <iostream> // 輸入輸出流庫&#xff0c;提供cin/cout等基本I/O功能 #include <map> // 映射容器庫&#xff0c;提供map數據結構&#xff08;鍵值對集合&#xff09; #include <string> // 字符串庫&#xff0c;…

使用assembly解決jar包超大,實現依賴包、前端資源外置部署

成果物需要部署到用戶內網的童鞋應該都遇到過該問題&#xff1a;引入的maven依賴越來越多&#xff0c;jar包越來越大&#xff0c;我之間甚至見過一兩個G的依賴&#xff0c;想改個代碼換到現場測試&#xff0c;包傳到現場要一二十分鐘&#xff0c;真正實現了改代碼兩分鐘分鐘&am…

基于PHP+MySQL實現(Web)英語學習與測試平臺

數據庫課設&#xff1a;英語學習與測試平臺 運行環境要求 PHP7.1 基于 thinkPHP6.0、Layui、Xadmin 開發 主要功能 公共模塊 登錄注冊個人信息修改密碼修改 教師模塊 文章查看發布班級管理測試查看發布批改歷史成績查看 學生模塊 文章查看參與測試查看成績 管理員模塊…

WinForm中Settings.settings和app.config修改后信息不同步到exe.config問題

在 WinForms 項目中&#xff0c;Settings.settings 和 app.config/exe.config 的關系確實容易讓人困惑。以下是問題的根本原因和解決方案&#xff1a; 問題本質 設計時文件&#xff1a;app.config&#xff08;源碼中的配置文件&#xff09;運行時文件&#xff1a;bin/Debug/Yo…