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

并發編程/6種線程池設計圖/1大線程池標準設計與執行規范/2種線程池管理設計(全面篇)

開發 前端
在Java 5之前,開發者需要手動管理線程的創建和銷毀,這不僅增加了編程復雜性,還可能導致資源浪費和系統開銷。?ExecutorService?通過提供線程池管理功能,簡化了線程的生命周期管理。

在現代多核處理器時代,線程池成為了并發編程中不可或缺的工具,它不僅提高了程序性能,還簡化了線程管理。線程池允許我們重用有限數量的線程來執行大量任務,從而減少了線程創建和銷毀的開銷。Java中的 ExecutorService接口及其實現類,如 FixedThreadPool、 SingleThreadExecutor、 CachedThreadPool和 ScheduledThreadPool,提供了強大的線程池管理功能。這些線程池通過智能地調度任務和復用線程,幫助我們優化資源利用,提高響應速度,并處理復雜的并發場景。對于Java開發者而言,理解線程池的工作原理和正確選擇適當的線程池類型對于構建高效、可伸縮的并發應用至關重要。

1、線程池工作流程

圖片圖片

  1. ExecutorService:這是線程池的管理接口,負責提交任務和管理工作線程。
  2. 任務隊列(Task Queue) :這是一個先進先出(FIFO)的隊列,用于存儲待執行的任務。
  3. 線程池(Thread Pool) :這是一組工作線程的集合,它們從任務隊列中取出任務并執行。
  4. 工作線程(Worker Thread) :線程池中的每個線程都會循環地從任務隊列中取出任務并執行。
  5. 任務(Task) :這是需要執行的具體任務,可以是 Runnable 或 Callable 對象。
  6. 返回結果(Return Result) :任務執行完成后,會返回結果或異常信息。

2、 ExecutorService 設計本質

  1. 線程生命周期管理:

在Java 5之前,開發者需要手動管理線程的創建和銷毀,這不僅增加了編程復雜性,還可能導致資源浪費和系統開銷。 ExecutorService 通過提供線程池管理功能,簡化了線程的生命周期管理。

  1. 系統開銷降低:

頻繁地創建和銷毀線程會導致性能問題和資源消耗。 ExecutorService 允許線程池重用線程,從而降低了系統開銷。

  1. 資源利用率提升:

通過線程池復用線程, ExecutorService 提高了資源利用率和程序響應速度,使得多線程編程更加靈活和高效。

  1. 豐富的任務調度和并發控制:

ExecutorService 提供了豐富的任務調度和并發控制能力,使得多線程編程更加靈活和高效。

  1. 硬件發展推動:

隨著多核架構的出現,Java的設計者們決定重新修訂Java的內存模型,并在JDK1.5中引入了 java.util.concurrent包,其中就包括了 ExecutorService接口,以支持更高效的并行計算。

  1. 簡化并發編程:

ExecutorService 作為Java并發編程的重要工具,簡化了并發編程的復雜性,使得開發者可以更容易地實現并行處理和任務調度。

  1. 提高程序性能:

ExecutorService 通過減少線程創建和銷毀的開銷,提高了程序的性能和可伸縮性。

  1. 線程池的易用性:

Executors 類提供了便捷的工廠方法來創建不同類型的線程池,使得開發者無需手動實現復雜的線程池邏輯,就可以方便地使用線程池。

3、線程池類設計

圖片圖片

在這個類設計圖中,我們有以下組件:

  • ExecutorService:這是一個接口,定義了線程池管理的方法,如 submit、 invokeAll、 invokeAny、 shutdown 等。
  • ThreadPoolExecutor:這是 ExecutorService 的一個具體實現,提供了線程池的詳細控制,如 execute、 submit、 shutdown 等。
  • ScheduledExecutorService:這是 ExecutorService 的一個子接口,用于延遲執行或定期執行任務。
  • FutureTask:這是 Future 接口的一個實現類,用于封裝異步任務,并提供方法如 run、 get、 isDone 等。

4、線程池功能范圍設計

4.1. 接口定義

  • ExecutorService 擴展了 Executor 接口,增加了提交任務后返回 Future 對象的方法,這些方法允許任務異步執行,并提供了獲取任務結果的機制。

4.2. 任務提交

  • submit(Callable<T>task): 提交一個返回結果的任務,并返回一個 Future 對象。
  • submit(Runnabletask): 提交一個不返回結果的任務,并返回一個 Future 對象。
  • submit(Runnabletask,T result): 提交一個不返回結果的任務,并返回一個已經設置好結果的 Future 對象。

4.3. 批量任務執行

  • invokeAll(Collection<?extendsCallable<T>>tasks): 提交一個任務集合,等待所有任務完成,并返回每個任務結果的列表。
  • invokeAny(Collection<?extendsCallable<T>>tasks): 提交一個任務集合,等待任意一個任務完成,并返回該任務的結果。

4.4. 線程池管理

  • shutdown(): 啟動一次有序的關閉,執行已提交的任務,不接受新任務。
  • shutdownNow(): 嘗試停止所有正在執行的任務,并返回未執行任務的列表。
  • awaitTermination(longtimeout,TimeUnitunit): 等待直到所有任務完成或超時。

4.5. 線程生命周期

ExecutorService 允許線程的復用,減少了線程創建和銷毀的開銷。線程池可以根據需要創建新線程或重用空閑線程。

4.6. 線程池的可擴展性

ExecutorService 可以與不同的線程池實現一起工作,如 FixedThreadPool、 CachedThreadPool、 ScheduledThreadPool 等,提供了高度的可擴展性和靈活性。

4.7. 異常處理

ExecutorService 提交的任務如果拋出異常,可以通過 Future 對象的 get 方法捕獲這些異常。

4.8. 結果處理

Future 對象提供了 get 方法來獲取任務結果,如果任務尚未完成, get 方法會阻塞直到任務完成。

4.9. 任務取消

Future 對象提供了 cancel 方法來取消任務,可以傳入一個布爾值參數來決定是否中斷正在執行的任務。

4.10. 線程工廠和拒絕策略

ExecutorService 可以使用自定義的線程工廠來創建線程,以及自定義的拒絕策略來處理任務提交過多時的情況。 ExecutorService 的設計提供了一個強大的框架,用于構建并發應用程序,它簡化了并發編程的復雜性,同時提供了豐富的控制和靈活的配置選項。通過 ExecutorService,開發者可以更容易地實現線程安全的異步任務執行。

5、線程池的種類

  • FixedThreadPool:

擁有固定數量線程的線程池,適用于負載較重的服務器。 

圖片圖片

  • SingleThreadExecutor:

只有一個線程的線程池,用于順序執行任務。 圖片

  • CachedThreadPool:

根據需要創建新線程的線程池,對于短生命周期的異步任務非常合適。 圖片

  • ScheduledThreadPool:

用于延遲執行或定期執行任務的線程池。 圖片

  • SingleThreadScheduledExecutor:

單個線程的變體,用于延遲或定時執行任務。 圖片

  • WorkStealingPool:

基于工作竊取算法的線程池,適用于并行計算。 

圖片圖片

這些線程池都是通過 Executors工具類提供的工廠方法來創建的。除了這些,開發者還可以通過直接實例化 ThreadPoolExecutor類來創建自定義配置的線程池。

ExecutorService接口本身并不定義線程池的具體實現,而是提供了一組通用的接口,用于管理和執行異步任務。不同的線程池實現提供了不同的功能和性能特性,以適應不同的并發場景。

6、 ThreadPoolExecutor 線程池設計

簡化版 

圖片圖片

  • 核心參數初始化:包括核心線程數、最大線程數、任務隊列、空閑線程存活時間和線程工廠等參數的初始化。
  • 任務提交到線程池:當任務被提交到線程池時,線程池會根據當前的狀態和參數來決定如何處理這個任務。
  • 線程獲取任務并執行:如果有空閑的核心線程,它會直接執行任務;如果沒有空閑的核心線程但任務隊列未滿,任務會被添加到任務隊列中。
  • 創建非核心線程執行任務:如果任務隊列已滿且當前線程數小于最大線程數,會創建一個新的非核心線程來執行任務。
  • 拒絕策略處理任務:如果任務隊列已滿且線程數達到最大線程數,任務將被拒絕,線程池會根據拒絕策略處理器來處理這個任務。
  • 線程池狀態管理: ThreadPoolExecutor 維護一個 ctl 變量,用于控制線程池的狀態,包括 RUNNING、SHUTDOWN、STOP、TIDYING 和 TERMINATED 等狀態。

詳細版 

圖片圖片

  • 創建 ThreadPoolExecutor:創建一個 ThreadPoolExecutor 實例,開始線程池的初始化過程。
  • 核心參數初始化:初始化線程池的核心參數,包括核心線程數、最大線程數、任務隊列、空閑線程存活時間和線程工廠。
  • 任務提交到線程池:當任務被提交到線程池時,線程池會根據當前的狀態和參數來決定如何處理這個任務。
  • 線程獲取任務并執行:如果有空閑的核心線程,它會直接執行任務;如果沒有空閑的核心線程但任務隊列未滿,任務會被添加到任務隊列中。
  • 創建非核心線程執行任務:如果任務隊列已滿且當前線程數小于最大線程數,會創建一個新的非核心線程來執行任務。
  • 拒絕策略處理任務:如果任務隊列已滿且線程數達到最大線程數,任務將被拒絕,線程池會根據拒絕策略處理器來處理這個任務。
  • 線程嘗試獲取新任務:任務執行完畢后,線程會嘗試從任務隊列中獲取新的任務。
  • 線程銷毀或等待新任務:如果任務隊列空,線程會進入空閑狀態,如果達到空閑線程存活時間,線程將被銷毀。
  • 線程池狀態檢查:線程池會根據其狀態來決定是否停止接收新任務,是否中斷運行中的任務,以及是否等待線程終止。

6.1 ThreadPoolExecutor應用

6.1.1. 服務器端處理請求

在服務器應用中, ThreadPoolExecutor 可以用來處理客戶端的請求。服務器可以創建一個固定大小的線程池來同時處理多個請求,提高響應速度和吞吐量。

int corePoolSize = 10; // 核心線程數
int maximumPoolSize = 50; // 最大線程數
long keepAliveTime = 120; // 空閑線程存活時間
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); // 任務隊列

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize,
    maximumPoolSize,
    keepAliveTime,
    unit,
    workQueue
);

// 提交任務到線程池
executor.execute(new ClientRequestHandler());
6.1.2. 批量數據處理

在處理批量數據時,如文件處理或數據庫批量操作, ThreadPoolExecutor 可以用來并行處理數據,提高處理速度。

List<Data> dataList = ...; // 待處理的數據列表
int threadCount = Runtime.getRuntime().availableProcessors(); // 使用可用處理器數量作為線程數

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    threadCount,
    threadCount,
    0L,
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>()
);

dataList.forEach(data -> executor.execute(new DataProcessorTask(data)));
6.1.3. 異步任務執行

在需要異步執行任務的場景中, ThreadPoolExecutor 可以用來提交任務并在未來某個時刻獲取結果。

Future<String> future = executor.submit(() -> {
    // 異步執行的任務
    return "任務結果";
});

// 獲取異步任務的結果
String result = future.get();
6.1.4. 定時和周期性任務

ThreadPoolExecutor 可以與 ScheduledExecutorService 結合使用,來執行定時和周期性任務。

ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1);

scheduledExecutor.scheduleAtFixedRate(() -> {
    // 定時執行的任務
}, 0, 10, TimeUnit.SECONDS);
6.1.5. 資源受限環境下的任務處理

在資源受限的環境中,如移動設備或嵌入式系統, ThreadPoolExecutor 可以用來合理分配有限的計算資源。

int maxThreads = 4; // 根據設備性能設置最大線程數

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    maxThreads,
    maxThreads,
    60L,
    TimeUnit.SECONDS,
    new SynchronousQueue<>()
);

7、 ScheduledExecutorService 線程池設計

圖片圖片

  • ScheduledExecutorService:這是線程池的管理接口,負責提交和管理任務。
  • 任務隊列(Task Queue) :這是一個延遲隊列,用于存儲待執行的任務,按照預定的執行時間排序。
  • 核心線程池(Core Thread Pool) :線程池中的核心線程會不斷地從任務隊列中取出任務并執行。
  • 工作線程(Worker Thread) :線程池中的線程負責執行任務。
  • 執行周期性任務(scheduleAtFixedRate) :用于安排任務以固定頻率執行。
  • 執行延遲任務(scheduleWithFixedDelay) :用于安排任務在每次執行完畢后按照固定延遲執行。
  • 執行單次任務(schedule) :用于安排任務在指定延遲后執行一次。
  • 任務完成:任務執行完畢后,如果是周期性任務,會重新調度下一次執行。
  • 線程池關閉(Thread Pool Shutdown) :當不再需要線程池時,可以關閉線程池,等待所有任務完成或嘗試立即停止所有任務。

7.1 ScheduledExecutorService應用案例

7.1.1. 一次性延遲執行任務

在這個例子中,我們創建了一個 ScheduledExecutorService 實例,并安排了一個任務在延遲一定時間后執行。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class DelayedTaskExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("任務在延遲后執行:" + System.currentTimeMillis());
        scheduler.schedule(task, 5, TimeUnit.SECONDS); // 5秒后執行
        scheduler.shutdown(); // 執行完畢后關閉調度器
    }
}
7.1.2. 固定速率周期執行任務

在這個例子中,我們安排了一個任務以固定的速率周期性執行。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class FixedRateTaskExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("定期任務執行時間: " + System.currentTimeMillis());
        scheduler.scheduleAtFixedRate(task, 0, 10, TimeUnit.SECONDS); // 每10秒執行一次
        scheduler.shutdown(); // 執行完畢后關閉調度器
    }
}
7.1.3. 固定延遲周期執行任務

在這個例子中,我們安排了一個任務在每次執行完畢后,等待固定的延遲時間再執行下一次。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class FixedDelayTaskExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("帶有固定延遲的任務執行時間: " + System.currentTimeMillis());
        scheduler.scheduleWithFixedDelay(task, 0, 15, TimeUnit.SECONDS); // 每次執行完畢后等待15秒再執行
        scheduler.shutdown(); // 執行完畢后關閉調度器
    }
}

責任編輯:武曉燕 來源: Solomon肖哥彈架構
相關推薦

2020-10-19 10:01:12

Nodejs線程池設計

2017-01-10 13:39:57

Python線程池進程池

2013-05-23 15:59:00

線程池

2020-09-04 10:29:47

Java線程池并發

2022-11-09 09:01:08

并發編程線程池

2023-06-07 13:49:00

多線程編程C#

2024-07-15 08:20:24

2023-05-19 08:01:24

Key消費場景

2023-07-05 07:48:04

線程池join關閉狀態

2023-07-11 08:34:25

參數流程類型

2024-10-06 14:37:52

2024-10-16 10:11:52

2020-07-08 12:05:55

Java線程池策略

2020-12-08 08:53:53

編程ThreadPoolE線程池

2024-12-27 09:08:25

2021-12-03 09:04:53

線程設計進程池

2024-11-11 17:39:01

2023-10-13 08:20:02

Spring線程池id

2012-05-15 02:18:31

Java線程池

2020-12-10 08:24:40

線程池線程方法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品视频免费在线 | 国产一区二区 | 久久久精品网 | 欧美综合精品 | 观看av | 日本一区二区视频 | 91国产在线播放 | 日一区二区| 免费黄色录像视频 | www.亚洲一区二区 | 亚洲欧美日韩在线 | 99热这里只有精品8 激情毛片 | 国产精品18hdxxxⅹ在线 | 欧美激情网站 | 亚洲第1页 | 国产欧美一区二区精品久导航 | av在线播放不卡 | 成人福利在线 | 欧美精品久久久 | 夜夜爽99久久国产综合精品女不卡 | 亚洲欧美v | 久久99久久99久久 | 国产成人久久精品一区二区三区 | 亚洲一区二区三区高清 | 国产精品欧美一区二区 | 国产成人免费视频网站视频社区 | 免费毛片www com cn | 成人国产精品久久久 | 亚洲午夜精品一区二区三区他趣 | 欧美国产亚洲一区二区 | 国产成人精品一区二区三区在线 | 欧美九九九 | 亚洲一区二区中文字幕 | 最新国产精品精品视频 | 国产精品午夜电影 | 九九亚洲| 九九国产| 久久夜色精品国产 | 久久久久久国产一区二区三区 | 夜夜av | 免费一区二区 |