Java線程池深度解析:從原理到實戰的完整指南

在這里插入圖片描述

Java線程池深度解析:從原理到實戰的完整指南

🌟 你好,我是 勵志成為糕手 !
🌌 在代碼的宇宙中,我是那個追逐優雅與性能的星際旅人。 ?
每一行代碼都是我種下的星光,在邏輯的土壤里生長成璀璨的銀河;
🛠? 每一個算法都是我繪制的星圖,指引著數據流動的最短路徑; 🔍
每一次調試都是星際對話,用耐心和智慧解開宇宙的謎題。
🚀 準備好開始我們的星際編碼之旅了嗎?

目錄

  • Java線程池深度解析:從原理到實戰的完整指南
    • 摘要
    • 1. 線程池基礎概念
      • 1.1 什么是線程池
      • 1.2 線程池的優勢
    • 2. ThreadPoolExecutor核心原理
      • 2.1 核心參數詳解
      • 2.2 線程池執行流程
      • 2.3 工作隊列類型對比
    • 3. 常用線程池類型
      • 3.1 Executors工廠方法
      • 3.2 線程池選擇決策圖
    • 4. 拒絕策略與異常處理
      • 4.1 四種內置拒絕策略
      • 4.2 拒絕策略對比分析
    • 5. 線程池監控與調優
      • 5.1 監控指標與實現
      • 5.2 性能調優策略
    • 6. 實戰案例:Web服務線程池優化
      • 6.1 問題場景與解決方案
      • 6.2 系統架構圖
    • 總結
    • 參考鏈接
    • 關鍵詞標簽

摘要

大家好,我是勵志成為糕手!今天我要和大家深入探討Java并發編程中的核心組件——線程池。在我多年的開發經驗中,線程池可以說是提升應用性能的利器,也是面試中的高頻考點。

線程池的本質是對線程資源的統一管理和復用。想象一下,如果每次需要執行任務都創建新線程,就像每次出門都要重新造車一樣低效。線程池就是我們的"車庫",里面停放著預先創建好的線程"車輛",需要時直接取用,用完歸還,大大提升了資源利用效率。

在實際項目中,我曾遇到過因為線程創建過多導致的內存溢出問題,也見過因為線程池配置不當引發的性能瓶頸。通過合理使用線程池,不僅能夠控制系統資源消耗,還能提供更好的任務管理能力,包括任務排隊、優先級處理、異常處理等。

本文將從線程池的基本概念出發,深入分析其核心原理,包括ThreadPoolExecutor的工作機制、核心參數配置、拒絕策略等。同時,我會結合實際案例,展示不同場景下的線程池選擇和優化策略,幫助大家在實際開發中游刃有余地運用這一強大工具。

1. 線程池基礎概念

1.1 什么是線程池

線程池是一種多線程處理形式,它預先創建若干個線程,這些線程在沒有任務處理時處于等待狀態,當有任務來臨時從線程池中取出一個空閑線程來處理任務,處理完之后線程不會銷毀,而是返回線程池繼續等待處理其他任務。

// 基本的線程池創建示例
public class BasicThreadPoolExample {public static void main(String[] args) {// 創建固定大小的線程池ExecutorService executor = Executors.newFixedThreadPool(5);// 提交任務for (int i = 0; i < 10; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName());try {Thread.sleep(2000); // 模擬任務執行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}// 關閉線程池executor.shutdown();}
}

這個示例展示了線程池的基本使用:創建固定大小的線程池,提交多個任務,最后關閉線程池。關鍵點在于線程的復用和任務的排隊機制。

1.2 線程池的優勢

線程池優勢
資源控制
性能提升
管理便利
響應速度
限制線程數量
避免資源耗盡
內存管理優化
線程復用
減少創建銷毀開銷
提高吞吐量
統一任務管理
監控和調試
異常處理
預創建線程
快速任務分配
減少等待時間

圖1:線程池優勢架構圖 - 展示線程池在資源控制、性能提升等方面的核心優勢

2. ThreadPoolExecutor核心原理

2.1 核心參數詳解

ThreadPoolExecutor是Java線程池的核心實現類,理解其構造參數是掌握線程池的關鍵:

public class ThreadPoolParameters {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(2,                      // corePoolSize: 核心線程數5,                      // maximumPoolSize: 最大線程數60L,                    // keepAliveTime: 空閑線程存活時間TimeUnit.SECONDS,       // unit: 時間單位new LinkedBlockingQueue<>(10),  // workQueue: 工作隊列new ThreadFactory() {   // threadFactory: 線程工廠private AtomicInteger counter = new AtomicInteger(0);@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, "CustomThread-" + counter.incrementAndGet());t.setDaemon(false);return t;}},new ThreadPoolExecutor.CallerRunsPolicy()  // handler: 拒絕策略);// 監控線程池狀態monitorThreadPool(executor);executor.shutdown();}private static void monitorThreadPool(ThreadPoolExecutor executor) {System.out.println("Core Pool Size: " + executor.getCorePoolSize());System.out.println("Maximum Pool Size: " + executor.getMaximumPoolSize());System.out.println("Current Pool Size: " + executor.getPoolSize());System.out.println("Active Count: " + executor.getActiveCount());System.out.println("Queue Size: " + executor.getQueue().size());}
}

這段代碼展示了ThreadPoolExecutor的完整構造過程,每個參數都有其特定作用,合理配置這些參數是線程池性能優化的基礎。

2.2 線程池執行流程

客戶端線程池核心線程工作隊列最大線程拒絕處理器提交任務創建核心線程執行任務完成任務入隊入隊成功獲取任務執行創建非核心線程執行任務觸發拒絕策略處理拒絕alt[未達最大線程數][達到最大線程數]alt[隊列未滿][隊列已滿]alt[核心線程未滿][核心線程已滿]客戶端線程池核心線程工作隊列最大線程拒絕處理器

圖2:線程池任務執行時序圖 - 展示任務從提交到執行的完整流程

2.3 工作隊列類型對比

隊列類型特點適用場景容量限制性能特征
ArrayBlockingQueue有界阻塞隊列資源受限環境固定容量高并發性能好
LinkedBlockingQueue可選有界隊列一般業務場景可配置吞吐量高
SynchronousQueue直接傳遞快速響應場景0延遲最低
PriorityBlockingQueue優先級隊列任務有優先級無界支持排序
DelayQueue延遲隊列定時任務無界支持延遲執行

3. 常用線程池類型

3.1 Executors工廠方法

public class ExecutorsExample {public static void demonstrateExecutors() {// 1. 固定線程池 - 適用于負載較重的服務器ExecutorService fixedPool = Executors.newFixedThreadPool(4);// 2. 緩存線程池 - 適用于執行很多短期異步任務ExecutorService cachedPool = Executors.newCachedThreadPool();// 3. 單線程池 - 適用于需要保證順序執行的場景ExecutorService singlePool = Executors.newSingleThreadExecutor();// 4. 定時線程池 - 適用于定時及周期性任務執行ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2);// 使用示例testFixedThreadPool(fixedPool);testScheduledThreadPool(scheduledPool);// 關閉所有線程池shutdownPools(fixedPool, cachedPool, singlePool, scheduledPool);}private static void testFixedThreadPool(ExecutorService executor) {System.out.println("=== 固定線程池測試 ===");for (int i = 0; i < 8; i++) {final int taskId = i;executor.submit(() -> {System.out.printf("Fixed Pool - Task %d executed by %s%n", taskId, Thread.currentThread().getName());simulateWork(1000);});}}private static void testScheduledThreadPool(ScheduledExecutorService executor) {System.out.println("=== 定時線程池測試 ===");// 延遲執行executor.schedule(() -> {System.out.println("延遲任務執行: " + new Date());}, 2, TimeUnit.SECONDS);// 周期性執行executor.scheduleAtFixedRate(() -> {System.out.println("周期任務執行: " + new Date());}, 1, 3, TimeUnit.SECONDS);}private static void simulateWork(long millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}private static void shutdownPools(ExecutorService... pools) {for (ExecutorService pool : pools) {pool.shutdown();}}
}

這個示例展示了不同類型線程池的創建和使用場景,每種線程池都有其特定的適用場景和性能特征。

3.2 線程池選擇決策圖

短時間
長時間
高頻
低頻
高頻
低頻
任務特征分析
任務執行時間
任務頻率
任務頻率
CachedThreadPool
快速響應短任務
SingleThreadExecutor
簡單順序執行
FixedThreadPool
穩定處理長任務
ScheduledThreadPool
定時任務處理
特殊需求
CustomThreadPool
自定義配置

圖3:線程池選擇象限圖 - 根據任務特征選擇合適的線程池類型

4. 拒絕策略與異常處理

4.1 四種內置拒絕策略

public class RejectionPolicyDemo {public static void demonstrateRejectionPolicies() {// 1. AbortPolicy - 拋出異常(默認)testAbortPolicy();// 2. CallerRunsPolicy - 調用者執行testCallerRunsPolicy();// 3. DiscardPolicy - 靜默丟棄testDiscardPolicy();// 4. DiscardOldestPolicy - 丟棄最老任務testDiscardOldestPolicy();// 5. 自定義拒絕策略testCustomRejectionPolicy();}private static void testAbortPolicy() {ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1),new ThreadPoolExecutor.AbortPolicy());try {// 提交超過容量的任務for (int i = 0; i < 5; i++) {executor.submit(() -> {try { Thread.sleep(1000); } catch (InterruptedException e) {}});}} catch (RejectedExecutionException e) {System.out.println("AbortPolicy: 任務被拒絕 - " + e.getMessage());} finally {executor.shutdown();}}private static void testCallerRunsPolicy() {ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1),new ThreadPoolExecutor.CallerRunsPolicy());System.out.println("CallerRunsPolicy測試開始,主線程: " + Thread.currentThread().getName());for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {System.out.printf("Task %d executed by %s%n", taskId, Thread.currentThread().getName());try { Thread.sleep(500); } catch (InterruptedException e) {}});}executor.shutdown();}// 自定義拒絕策略private static void testCustomRejectionPolicy() {ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<>(1),new CustomRejectedExecutionHandler());for (int i = 0; i < 5; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Custom Policy - Task " + taskId + " executed");try { Thread.sleep(1000); } catch (InterruptedException e) {}});}executor.shutdown();}// 自定義拒絕處理器static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {System.out.println("自定義拒絕策略: 任務被拒絕,嘗試重新提交到備用隊列");// 可以實現重試邏輯、記錄日志、發送告警等try {Thread.sleep(100);if (!executor.isShutdown()) {executor.getQueue().offer(r, 500, TimeUnit.MILLISECONDS);}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}

這段代碼展示了所有內置拒絕策略的行為特征,以及如何實現自定義拒絕策略來滿足特定業務需求。

4.2 拒絕策略對比分析

40%30%15%10%5%拒絕策略使用場景分布AbortPolicy(快速失敗)CallerRunsPolicy(調用者執行)DiscardPolicy(靜默丟棄)DiscardOldestPolicy(丟棄最老)自定義策略

圖4:拒絕策略使用分布餅圖 - 展示不同拒絕策略在實際項目中的使用比例

5. 線程池監控與調優

5.1 監控指標與實現

public class ThreadPoolMonitor {private final ThreadPoolExecutor executor;private final ScheduledExecutorService monitorExecutor;public ThreadPoolMonitor(ThreadPoolExecutor executor) {this.executor = executor;this.monitorExecutor = Executors.newScheduledThreadPool(1);startMonitoring();}private void startMonitoring() {monitorExecutor.scheduleAtFixedRate(() -> {ThreadPoolMetrics metrics = collectMetrics();logMetrics(metrics);checkAlerts(metrics);}, 0, 5, TimeUnit.SECONDS);}private ThreadPoolMetrics collectMetrics() {return new ThreadPoolMetrics(executor.getCorePoolSize(),           // 核心線程數executor.getMaximumPoolSize(),        // 最大線程數executor.getPoolSize(),               // 當前線程數executor.getActiveCount(),            // 活躍線程數executor.getQueue().size(),           // 隊列大小executor.getCompletedTaskCount(),     // 已完成任務數executor.getTaskCount()               // 總任務數);}private void logMetrics(ThreadPoolMetrics metrics) {System.out.printf("""=== 線程池監控報告 ===核心線程數: %d | 最大線程數: %d | 當前線程數: %d活躍線程數: %d | 隊列大小: %d已完成任務: %d | 總任務數: %d線程池利用率: %.2f%% | 隊列利用率: %.2f%%========================%n""",metrics.corePoolSize, metrics.maximumPoolSize, metrics.poolSize,metrics.activeCount, metrics.queueSize,metrics.completedTaskCount, metrics.taskCount,(double) metrics.activeCount / metrics.maximumPoolSize * 100,(double) metrics.queueSize / ((LinkedBlockingQueue<?>) executor.getQueue()).remainingCapacity() * 100);}private void checkAlerts(ThreadPoolMetrics metrics) {// 線程池利用率告警double utilization = (double) metrics.activeCount / metrics.maximumPoolSize;if (utilization > 0.8) {System.out.println("?? 告警: 線程池利用率過高 " + String.format("%.2f%%", utilization * 100));}// 隊列積壓告警if (metrics.queueSize > 50) {System.out.println("?? 告警: 任務隊列積壓嚴重,當前隊列大小: " + metrics.queueSize);}}public void shutdown() {monitorExecutor.shutdown();}// 監控指標數據類static class ThreadPoolMetrics {final int corePoolSize;final int maximumPoolSize;final int poolSize;final int activeCount;final int queueSize;final long completedTaskCount;final long taskCount;ThreadPoolMetrics(int corePoolSize, int maximumPoolSize, int poolSize,int activeCount, int queueSize, long completedTaskCount, long taskCount) {this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.poolSize = poolSize;this.activeCount = activeCount;this.queueSize = queueSize;this.completedTaskCount = completedTaskCount;this.taskCount = taskCount;}}
}

這個監控系統提供了全面的線程池運行狀態監控,包括關鍵指標收集、實時告警和性能分析功能。

5.2 性能調優策略

“在并發編程中,線程池的配置不是一成不變的藝術,而是需要根據實際負載動態調整的科學。合理的線程池配置能夠在資源消耗和性能表現之間找到最佳平衡點。” —— 《Java并發編程實戰》

public class ThreadPoolTuning {// CPU密集型任務線程池配置public static ThreadPoolExecutor createCpuIntensivePool() {int cpuCount = Runtime.getRuntime().availableProcessors();return new ThreadPoolExecutor(cpuCount,                           // 核心線程數 = CPU核心數cpuCount,                           // 最大線程數 = CPU核心數0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(100),     // 有界隊列防止內存溢出new ThreadFactory() {private final AtomicInteger counter = new AtomicInteger(0);@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, "CPU-Worker-" + counter.incrementAndGet());t.setDaemon(false);return t;}},new ThreadPoolExecutor.CallerRunsPolicy());}// IO密集型任務線程池配置public static ThreadPoolExecutor createIoIntensivePool() {int cpuCount = Runtime.getRuntime().availableProcessors();return new ThreadPoolExecutor(cpuCount * 2,                       // 核心線程數 = CPU核心數 * 2cpuCount * 4,                       // 最大線程數 = CPU核心數 * 460L, TimeUnit.SECONDS,              // 空閑線程存活時間new LinkedBlockingQueue<>(200),r -> {Thread t = new Thread(r, "IO-Worker-" + System.currentTimeMillis());t.setDaemon(false);return t;},new ThreadPoolExecutor.CallerRunsPolicy());}// 動態調整線程池大小public static void dynamicTuning(ThreadPoolExecutor executor) {ScheduledExecutorService tuner = Executors.newScheduledThreadPool(1);tuner.scheduleAtFixedRate(() -> {int queueSize = executor.getQueue().size();int activeCount = executor.getActiveCount();int corePoolSize = executor.getCorePoolSize();// 根據隊列積壓情況動態調整if (queueSize > 50 && corePoolSize < 10) {executor.setCorePoolSize(corePoolSize + 1);System.out.println("增加核心線程數至: " + (corePoolSize + 1));} else if (queueSize < 10 && activeCount < corePoolSize / 2 && corePoolSize > 2) {executor.setCorePoolSize(corePoolSize - 1);System.out.println("減少核心線程數至: " + (corePoolSize - 1));}}, 10, 10, TimeUnit.SECONDS);}
}

這段代碼展示了針對不同類型任務的線程池配置策略,以及動態調優的實現方法。

6. 實戰案例:Web服務線程池優化

6.1 問題場景與解決方案

@Service
public class OrderProcessingService {// 訂單處理線程池 - IO密集型private final ThreadPoolExecutor orderPool;// 通知發送線程池 - 網絡IO密集型private final ThreadPoolExecutor notificationPool;// 數據統計線程池 - CPU密集型private final ThreadPoolExecutor analyticsPool;public OrderProcessingService() {// 訂單處理線程池配置this.orderPool = new ThreadPoolExecutor(5, 20, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(100),r -> new Thread(r, "OrderProcessor-" + System.currentTimeMillis()),new ThreadPoolExecutor.CallerRunsPolicy());// 通知線程池配置 - 允許更多線程處理網絡IOthis.notificationPool = new ThreadPoolExecutor(3, 15, 30L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(50),r -> new Thread(r, "NotificationSender-" + System.currentTimeMillis()),new ThreadPoolExecutor.DiscardOldestPolicy()  // 丟棄最老的通知任務);// 分析線程池配置 - CPU密集型任務int cpuCount = Runtime.getRuntime().availableProcessors();this.analyticsPool = new ThreadPoolExecutor(cpuCount, cpuCount, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(20),r -> new Thread(r, "Analytics-" + System.currentTimeMillis()),new ThreadPoolExecutor.AbortPolicy());}public CompletableFuture<OrderResult> processOrder(Order order) {return CompletableFuture.supplyAsync(() -> {// 1. 訂單驗證和處理validateOrder(order);return processOrderLogic(order);}, orderPool).thenCompose(result -> {// 2. 異步發送通知CompletableFuture<Void> notification = CompletableFuture.runAsync(() -> sendNotification(order, result), notificationPool);// 3. 異步更新統計CompletableFuture<Void> analytics = CompletableFuture.runAsync(() -> updateAnalytics(order, result), analyticsPool);// 4. 等待通知完成,但不等待統計(允許異步)return notification.thenApply(v -> result);}).exceptionally(throwable -> {System.err.println("訂單處理失敗: " + throwable.getMessage());return new OrderResult(false, "處理失敗");});}private void validateOrder(Order order) {// 訂單驗證邏輯if (order == null || order.getAmount() <= 0) {throw new IllegalArgumentException("無效訂單");}simulateWork(100); // 模擬驗證耗時}private OrderResult processOrderLogic(Order order) {// 模擬訂單處理邏輯simulateWork(500);return new OrderResult(true, "訂單處理成功");}private void sendNotification(Order order, OrderResult result) {// 模擬發送通知(網絡IO)simulateWork(200);System.out.println("通知已發送: " + order.getId());}private void updateAnalytics(Order order, OrderResult result) {// 模擬數據分析(CPU密集型)simulateWork(300);System.out.println("統計已更新: " + order.getId());}private void simulateWork(long millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}@PreDestroypublic void shutdown() {shutdownPool(orderPool, "OrderPool");shutdownPool(notificationPool, "NotificationPool");shutdownPool(analyticsPool, "AnalyticsPool");}private void shutdownPool(ThreadPoolExecutor pool, String name) {pool.shutdown();try {if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {pool.shutdownNow();System.out.println(name + " 強制關閉");}} catch (InterruptedException e) {pool.shutdownNow();Thread.currentThread().interrupt();}}// 訂單和結果類static class Order {private String id;private double amount;public Order(String id, double amount) {this.id = id;this.amount = amount;}public String getId() { return id; }public double getAmount() { return amount; }}static class OrderResult {private boolean success;private String message;public OrderResult(boolean success, String message) {this.success = success;this.message = message;}public boolean isSuccess() { return success; }public String getMessage() { return message; }}
}

這個實戰案例展示了在Web服務中如何根據不同任務特性配置專用線程池,實現任務的并行處理和資源的合理分配。

6.2 系統架構圖

存儲層
線程池處理層
API層
數據庫
Database
Redis緩存
Cache
消息隊列
MQ
訂單處理線程池
OrderPool
核心:5 最大:20
通知發送線程池
NotificationPool
核心:3 最大:15
數據分析線程池
AnalyticsPool
核心:CPU數 最大:CPU數
Order Controller
Order Service

圖5:訂單處理系統架構圖 - 展示多線程池協作的完整系統架構

總結

通過這次深入的Java線程池探索之旅,我深刻體會到了線程池在現代Java應用中的重要地位。作為勵志成為糕手,我想和大家分享幾個關鍵的心得體會。

首先,線程池不僅僅是一個技術工具,更是一種資源管理的哲學。它教會我們如何在有限的資源下實現最大的效率,這種思維方式在軟件架構設計中具有普遍的指導意義。通過合理配置核心參數,我們能夠在響應速度、吞吐量和資源消耗之間找到最佳平衡點。

其次,監控和調優是線程池應用的關鍵環節。在實際項目中,我發現很多性能問題都源于線程池配置不當或缺乏有效監控。建立完善的監控體系,不僅能夠及時發現問題,還能為后續的優化提供數據支撐。動態調優機制更是讓系統具備了自適應能力,能夠根據實際負載情況自動調整資源配置。

再者,不同類型的任務需要不同的線程池策略。CPU密集型任務適合較少的線程數,而IO密集型任務則可以配置更多線程來提高并發度。在復雜的業務系統中,往往需要多個專用線程池協同工作,每個線程池負責特定類型的任務,這樣既能保證性能,又能實現良好的資源隔離。

最后,異常處理和優雅關閉同樣重要。合適的拒絕策略能夠在系統過載時保護核心功能,而優雅的關閉流程則確保了系統的穩定性和數據的完整性。這些細節往往決定了系統在極端情況下的表現。

線程池的學習讓我更加深刻地理解了并發編程的精髓:不是簡單地增加線程數量,而是要科學地管理和調度線程資源。在未來的開發工作中,我會繼續深入研究并發編程的各個方面,為構建高性能、高可用的系統貢獻自己的力量。

🌟 我是 勵志成為糕手 ,感謝你與我共度這段技術時光!
? 如果這篇文章為你帶來了啟發:
? 【收藏】關鍵知識點,打造你的技術武器庫
💡【評論】留下思考軌跡,與同行者碰撞智慧火花
🚀 【關注】持續獲取前沿技術解析與實戰干貨
🌌 技術探索永無止境,讓我們繼續在代碼的宇宙中:
? 用優雅的算法繪制星圖
? 以嚴謹的邏輯搭建橋梁
? 讓創新的思維照亮前路
📡 保持連接,我們下次太空見!

參考鏈接

  1. Oracle Java Documentation - Executor Framework
  2. Java Concurrency in Practice - ThreadPoolExecutor
  3. Spring Framework - Task Execution and Scheduling
  4. Baeldung - Java ThreadPoolExecutor Guide
  5. IBM Developer - Java concurrency utilities

關鍵詞標簽

Java線程池 ThreadPoolExecutor 并發編程 性能優化 拒絕策略

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

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

相關文章

機器學習——模型架構

有監督學習 線性模型 多元線性回歸&#xff1a;預測連續的數值&#xff08;如房價、銷量&#xff09;。 邏輯回歸&#xff1a;解決二分類問題&#xff08;如判斷郵件是否是垃圾郵件&#xff09;&#xff0c;輸出概率。 非線性模型 決策樹&#xff1a;通過一系列if-then規則進行…

深入理解Kafka事務

一 kafka事務介紹1.1 Kafka事務的作用Exactly-Once Semantics (EOS)&#xff1a;在“消費 → 處理 → 生產”的流式鏈路里避免重復寫與重復讀帶來的副作用&#xff0c;確保“處理一次且僅一次”的可見效果。跨分區 / 跨 Topic 原子性&#xff1a;將一次處理內寫入的多分區多主題…

RabbitMinQ(模擬實現消息隊列項目)

目錄 一.消息隊列背景 二.需求分析 核心概念: BrokerServer: BrokerServer的核心API: 交換機Exchange: 持久化&#xff1a; 網絡通信&#xff1a; 消息應答&#xff1a; 三、模塊劃分 四、創建項目 五、創建核心類 Exchange: MSGQueue: Binding: Message: 六.…

如何構建StarRocks官方文檔

不知道是網絡問題還是官網問題&#xff0c;StarRocks文檔經常出現卡頓的情況&#xff0c;曾經構建過Flink文檔&#xff0c; 所以也想嘗試自己構建一個StarRocks的本地官方文檔 斷斷續續折騰了好幾天&#xff0c;就不廢話了&#xff0c;直接上實際步驟 1. 環境 1.1 Linux環境 …

堡壘機(跳板機)入門指南:構建更安全的多服務器運維架構

隨著你的業務不斷擴張&#xff0c;你云上服務器的數量&#xff0c;是不是也從一臺&#xff0c;變成了三臺、五臺、甚至一個由幾十臺機器組成的龐大集群&#xff1f;你像一個盡職的“國王”&#xff0c;為你王國的每一座“城池”&#xff08;每一臺服務器&#xff09;&#xff0…

(鏈表)Leetcode206鏈表反轉+Leetcode6刪除鏈表的倒數第N個結點+虛擬頭節點使用

虛擬頭結點的作用是&#xff1a;簡化插入/刪除邏輯方便返回頭節點減少邊界錯誤 Leetcode206鏈表反轉 206. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 頭插法 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextN…

自然語言處理NLP:嵌入層Embedding中input_dim的計算——Tokenizer文本分詞和編碼

1. 詞匯表大小&#xff08;input_dim&#xff09;計算方法 嵌入層Embedding中的input_dim是根據數據中所有唯一詞&#xff08;或字&#xff09;的總數來決定的。可以通過Tokenizer文本分詞和編碼得到。 簡單說&#xff0c;Tokenizer 是一個文本分詞和編碼器&#xff0c;它主要做…

python中的分代垃圾回收機制的原理【python進階二、2】

1. 分代設計思想Python 將對象按存活時間分為三代&#xff08;Generation 0, 1, 2&#xff09;&#xff1a;0代&#xff08;年輕代&#xff09;&#xff1a;新創建的對象。1代&#xff08;中年代&#xff09;&#xff1a;經歷一次GC掃描后存活的對象。2代&#xff08;老年代&am…

【后端】云服務器用nginx配置域名訪問前后端分離項目

云服務器有多個服務&#xff08;前端 3000 端口、后端 8288 端口&#xff0c;甚至還有別的服務&#xff09;。希望用戶只輸入 域名&#xff08;比如 https://example.com&#xff09;&#xff0c;而不是 example.com:3000、example.com:8288。本質上是要做 端口隱藏 域名統一入…

軟考中級數據庫系統工程師學習專篇(67、數據庫恢復)

67、數據庫恢復數據庫故障恢復中基于檢查點的事務分類與處理策略在數據庫系統發生故障后的恢復過程中&#xff0c;?檢查點&#xff08;Checkpoint&#xff09;?? 技術是關鍵機制&#xff0c;它能有效縮小恢復范圍&#xff0c;減少需要掃描的日志量&#xff0c;從而加速恢復進…

SpringBoot 分庫分表 - 實現、配置與優化

分庫分表&#xff08;Database Sharding&#xff09;是一種數據庫架構優化技術&#xff0c;通過將數據分散到多個數據庫或表中&#xff0c;以應對高并發、大數據量場景&#xff0c;提升系統性能和擴展性。 在 Spring Boot 中&#xff0c;分庫分表可以通過框架支持&#xff08;如…

爬蟲代理實操:選擇可靠的HTTP(S)代理的方法

在爬蟲工作里&#xff0c;選對代理協議&#xff08;HTTP/HTTPS&#xff09;只是第一步&#xff0c;更關鍵的是找到 “可靠” 的代理 —— 哪怕是 HTTPS 代理&#xff0c;若節點不穩定、IP 純凈度低&#xff0c;照樣會頻繁被封&#xff0c;反而耽誤采集進度。這幾年踩過不少坑&a…

數據庫常見故障類型

數據庫常見故障類型數據庫系統運行過程中可能發生的故障主要分為以下三類&#xff0c;其破壞性由小到大&#xff1a;故障類型別名根本原因影響范圍典型例子?1. 事務故障?邏輯故障事務內部的程序邏輯錯誤或輸入異常。?單個或少量事務。- 輸入數據不合法&#xff08;如除零錯誤…

【Android】Span富文本簡介

一&#xff0c;概述android.text包下span體系類&#xff0c;主要指Spanned、Spannable、ParagraphStyle、CharacterStyle實現類。Android通過Span體系&#xff0c;搭建了富文本API&#xff0c;其中Spanned、Spannable實現了CharSequence接口&#xff0c;旨在映射段落start~end之…

【HTML】draggable 屬性:解鎖網頁交互新維度

一、簡介 在Web開發中&#xff0c;用戶與內容的交互方式直接影響用戶體驗的深度。在 HTML 中&#xff0c;draggable 是一個全局屬性&#xff0c;通過簡單配置即可讓任意元素實現拖拽功能。也可通過結合 draggable 屬性和 JavaScript 事件&#xff0c;可以實現豐富的拖放交互功能…

如何在Github中創建倉庫?如何將本地項目上傳到GitHub中?

1.1 點擊New repository&#xff08;這個是創建代碼倉庫的意思&#xff09;初次完成后只有一個文件最后&#xff1a;在本地git clone 項目地址然后把項目文件復制到git的文件夾內再提交到遠程倉庫git add . git commit -m "修改https"git push origin mainmain為分支…

【前端教程】HTML 基礎界面開發

一、網站導航欄設計與實現 導航欄是網站的重要組成部分&#xff0c;負責引導用戶瀏覽網站的各個板塊。以下是一個實用的導航欄實現方案&#xff1a; 實現代碼 HTML 結構&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /&…

【學Python自動化】 6. Python 模塊系統學習筆記

一、模塊基礎 什么是模塊&#xff1f;包含 Python 定義和語句的 .py 文件解決代碼復用和組織問題每個模塊有自己的命名空間創建模塊示例# fibo.py - 斐波那契模塊 def fib(n):"""打印小于n的斐波那契數列"""a, b 0, 1while a < n:print(a, e…

機器學習-時序預測2

門控循環單元GRU 接著機器學習-時序預測1-CSDN博客這個說&#xff0c;GRU是LSTM的一個簡化而高效的變體&#xff0c;都使用“門控機制”來控制信息流&#xff0c;但它通過合并一些組件&#xff0c;使結構更簡單、參數更少、計算更快&#xff0c;同時在許多任務上性能與 LSTM 相…

數據湖與數據倉庫

大數據前沿技術詳解 目錄 數據湖技術湖倉一體架構數據網格實時流處理技術云原生數據技術數據治理與血緣AI原生數據平臺邊緣計算與大數據 核心內容包括&#xff1a; 數據湖技術 - 架構模式、技術棧、面臨的挑戰 湖倉一體架構 - Delta Lake、Iceberg、Hudi等主流實現 數據網格…