日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

線程池系統(tǒng)設置最全指南!

來源: 責編: 時間:2024-01-08 17:10:24 249觀看
導讀Java中的線程創(chuàng)建會帶來顯著的開銷。創(chuàng)建線程消耗時間,增加了請求處理的延遲,并涉及JVM和操作系統(tǒng)的大量工作。為了減輕這些開銷,引入了線程池的概念。在本文中,我們深入探討確定理想線程池大小的藝術。一個經(jīng)過精心調(diào)整

Java中的線程創(chuàng)建會帶來顯著的開銷。創(chuàng)建線程消耗時間,增加了請求處理的延遲,并涉及JVM和操作系統(tǒng)的大量工作。為了減輕這些開銷,引入了線程池的概念。LOm28資訊網(wǎng)——每日最新資訊28at.com

在本文中,我們深入探討確定理想線程池大小的藝術。一個經(jīng)過精心調(diào)整的線程池可以從系統(tǒng)中提取出最佳性能,并幫助你在高峰工作負載中優(yōu)雅地導航。然而,必須記住,即使使用線程池,線程的管理本身也可能成為瓶頸。LOm28資訊網(wǎng)——每日最新資訊28at.com

1 使用線程池的原因

  • 性能:線程的創(chuàng)建和銷毀可能很昂貴,尤其是在Java中。線程池通過創(chuàng)建可以重復用于多個任務的線程池來減少這種開銷。
  • 可伸縮性:線程池可以根據(jù)應用程序的需求進行擴展。例如,在負載較重時,線程池可以擴展以處理額外的任務。
  • 資源管理:線程池可以幫助管理線程使用的資源。例如,線程池可以限制在任何給定時間可以活動的線程數(shù),這有助于防止應用程序耗盡內(nèi)存。

2 設置線程池大小:了解系統(tǒng)和資源限制

在確定線程池大小時,了解系統(tǒng)的限制,包括硬件和外部依賴項,是至關重要的。讓我們通過一個例子詳細說明這個概念:LOm28資訊網(wǎng)——每日最新資訊28at.com

2.1 情景

假設你正在開發(fā)一個處理傳入HTTP請求的Web應用程序。每個請求可能涉及從數(shù)據(jù)庫處理數(shù)據(jù)并調(diào)用外部第三方服務。你的目標是確定有效的線程池大小以有效處理這些請求。LOm28資訊網(wǎng)——每日最新資訊28at.com

2.2 考慮的因素

數(shù)據(jù)庫連接池:假設你正在使用像HikariCP這樣的連接池來管理數(shù)據(jù)庫連接。你已將其配置為允許最多100個連接。如果創(chuàng)建的線程多于可用連接,這些額外的線程將等待可用連接,導致資源爭用和潛在的性能問題。LOm28資訊網(wǎng)——每日最新資訊28at.com

下面是配置HikariCP數(shù)據(jù)庫連接池的示例:LOm28資訊網(wǎng)——每日最新資訊28at.com

import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;public class DatabaseConnectionExample {    public static void main(String[] args) {        HikariConfig config = new HikariConfig();        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");        config.setUsername("username");        config.setPassword("password");        config.setMaximumPoolSize(100); // 設置最大連接數(shù)        HikariDataSource dataSource = new HikariDataSource(config);        // 使用dataSource獲取數(shù)據(jù)庫連接并執(zhí)行查詢。    }}

外部服務吞吐量:你的應用程序與之交互的外部服務有一個限制。它只能同時處理少量請求,例如一次處理10個請求。同時發(fā)送更多請求可能會***使服務不堪重負,導致性能下降或錯誤***。LOm28資訊網(wǎng)——每日最新資訊28at.com

CPU核心:確定服務器上可用的CPU核心數(shù)量對于優(yōu)化線程池大小至關重要。LOm28資訊網(wǎng)——每日最新資訊28at.com

int numOfCores = Runtime.getRuntime().availableProcessors();

每個核心可以同時執(zhí)行一個線程。超過CPU核心數(shù)的線程可能導致過多的上下文切換,從而降低性能。LOm28資訊網(wǎng)——每日最新資訊28at.com

3 CPU密集型任務和I/O密集型任務

CPU密集型任務是那些需要大量處理能力的任務,例如執(zhí)行復雜計算或運行模擬。這些任務通常受限于CPU速度,而不是I/O設備的速度。LOm28資訊網(wǎng)——每日最新資訊28at.com

  • 編碼或解碼音頻或視頻文件
  • 編譯和鏈接軟件
  • 運行復雜的模擬
  • 執(zhí)行機器學習或數(shù)據(jù)挖掘任務
  • 玩視頻游戲

3.1  優(yōu)化:

  • 多線程和并行性:并行處理是一種技術,用于將較大的任務分解為較小的子任務,并將這些子任務分配給多個CPU核心或處理器,以利用并發(fā)執(zhí)行并提高整體性能。

假設你有一個大型的數(shù)字數(shù)組,并且想要利用多個線程并行地計算每個數(shù)字的平方。LOm28資訊網(wǎng)——每日最新資訊28at.com

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ParallelSquareCalculator {    public static void main(String[] args) {        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};        int numThreads = Runtime.getRuntime().availableProcessors(); // 獲取CPU核心數(shù)        ExecutorService executorService = Executors.newFixedThreadPool(numThreads);        for (int number : numbers) {            executorService.submit(() -> {                int square = calculateSquare(number);                System.out.println("Square of " + number + " is " + square);            });        }        executorService.shutdown();        try {            executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);        } catch (InterruptedException e) {            Thread.currentThread().interrupt();        }    }    private static int calculateSquare(int number) {        // 模擬耗時的計算(例如,數(shù)據(jù)庫查詢,復雜計算)        try {            Thread.sleep(1000); // 模擬1秒延遲        } catch (InterruptedException e) {            Thread.currentThread().interrupt();        }        return number * number;    }}

I/O密集型任務是LOm28資訊網(wǎng)——每日最新資訊28at.com

那些與存儲設備交互(例如,讀/寫文件),網(wǎng)絡套接字(例如,發(fā)起API調(diào)用)或用戶輸入(例如,圖形用戶界面中的用戶交互)的任務。LOm28資訊網(wǎng)——每日最新資訊28at.com

  • 從磁盤讀取或寫入大型文件(例如,保存視頻文件,加載數(shù)據(jù)庫)
  • 在網(wǎng)絡上下載或上傳文件(例如,瀏覽網(wǎng)頁,觀看流媒體視頻)
  • 發(fā)送和接收電子郵件
  • 運行Web服務器或其他網(wǎng)絡服務
  • 執(zhí)行數(shù)據(jù)庫查詢
  • 處理傳入請求的Web服務器。

3.2 優(yōu)化

  • 緩存:在內(nèi)存中緩存經(jīng)常訪問的數(shù)據(jù),以減少重復的I/O操作。
  • 負載平衡:將I/O密集型任務分布在多個線程或進程中,以有效處理并發(fā)的I/O操作。
  • 使用SSD:固態(tài)硬盤(SSD)可以顯著加速I/O操作,與傳統(tǒng)的硬盤驅動器(HDD)相比。
  • 使用高效的數(shù)據(jù)結構,例如哈希表和B樹,以減少所需的I/O操作次數(shù)。
  • 避免不必要的文件操作,例如多次打開和關閉文件。

4  確定線程數(shù)量

4.1 CPU密集型任務:

對于CPU綁定的任務,你希望在不過分負擔系統(tǒng)的情況下最大化CPU利用率,過多的線程可能導致過多的上下文切換,從而降低性能。一個常見的經(jīng)驗法則是使用可用的CPU核心數(shù)。LOm28資訊網(wǎng)——每日最新資訊28at.com

視頻編碼

想象一下,你正在開發(fā)一個視頻處理應用程序。視頻編碼是一個CPU密集型任務,你需要對視頻文件應用復雜的算法進行壓縮。你有一個多核CPU可用。LOm28資訊網(wǎng)——每日最新資訊28at.com

為CPU綁定的任務確定線程數(shù):

  1. 計算可用CPU核心數(shù):使用**Runtime.getRuntime().availableProcessors()**在Java中確定可用CPU核心數(shù)。假設你有8個核心。
  2. 創(chuàng)建線程池:創(chuàng)建一個線程池,其大小接近或略小于可用CPU核心數(shù)。在這種情況下,你可能選擇6或7個線程,以為其他任務和系統(tǒng)進程留出一些CPU容量。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class VideoEncodingApp {    public static void main(String[] args) {        int availableCores = Runtime.getRuntime().availableProcessors();        int numberOfThreads = Math.max(availableCores - 1, 1); // 根據(jù)需要調(diào)整        ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads);        // 將視頻編碼任務提交到線程池。        for (int i = 0; i < 10; i++) {            threadPool.execute(() -> {                encodeVideo(); // 模擬視頻編碼任務            });        }        threadPool.shutdown();    }    private static void encodeVideo() {        // 模擬視頻編碼(CPU綁定)任務。        // 復雜的計算和壓縮算法在這里。    }}

4.2 對于I/O密集型任務

對于I/O綁定的任務,理想的線程數(shù)通常取決于I/O操作的性質(zhì)和預期的延遲。你希望有足夠的線程使I/O設備保持繁忙,而不會過載它們。理想的數(shù)字可能不一定等于CPU核心數(shù)。LOm28資訊網(wǎng)——每日最新資訊28at.com

網(wǎng)頁爬取

考慮構建一個下載網(wǎng)頁并提取信息的網(wǎng)絡爬蟲。這涉及進行I/O綁定的任務,由于網(wǎng)絡延遲,可能需要發(fā)出HTTP請求。LOm28資訊網(wǎng)——每日最新資訊28at.com

為I/O密集型任務確定線程數(shù)

  1. 分析I/O延遲:估計預期的I/O延遲,這取決于網(wǎng)絡或存儲。例如,如果每個HTTP請求大約需要500毫秒完成,你可能希望為I/O操作中的一些重疊提供一些余地。
  2. 創(chuàng)建線程池:創(chuàng)建一個線程池,其大小在并行性與預期的I/O延遲之間取得平衡。你不一定需要每個任務一個線程;相反,你可以擁有一個較小的池,有效地管理I/O密集型任務。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class WebPageCrawler {    public static void main(String[] args) {        int expectedIOLatency = 500; // 估計的I/O延遲,單位毫秒        int numberOfThreads = 4; // 根據(jù)預期的延遲和系統(tǒng)能力進行調(diào)整        ExecutorService threadPool = Executors.newFixedThreadPool(numberOfThreads);        // 要爬取的URL列表。        String[] urlsToCrawl = {            "https://example.com",            "https://google.com",            "https://github.com",            // 在此添加更多的URL        };        for (String url : urlsToCrawl) {            threadPool.execute(() -> {                crawlWebPage(url, expectedIOLatency);            });        }        threadPool.shutdown();    }    private static void crawlWebPage(String url, int expectedIOLatency) {        // 模擬網(wǎng)頁爬取(I/O綁定)任務。        // 執(zhí)行HTTP請求并處理頁面內(nèi)容。        try {            Thread.sleep(expectedIOLatency); // 模擬I/O延遲        } catch (InterruptedException e) {            Thread.currentThread().interrupt();        }    }}

5 是否可以遵循一個具體的公式?

確定線程池大小的公式可以寫成如下:LOm28資訊網(wǎng)——每日最新資訊28at.com

Number of threads = Number of Available Cores * Target CPU utilization * (1 + Wait time / Service time)

Number of Available Cores: 這是你的應用程序可用的***CPU核心數(shù)***。重要的是要注意,這與CPU數(shù)不同,因為***每個CPU可能有多個核心。***LOm28資訊網(wǎng)——每日最新資訊28at.com

Target CPU utilization: 這是你希望你的應用程序使用的CPU時間的百分比***。如果設置目標CPU利用率過高,你的應用程序可能會變得無響應*。如果設置得太低,你的應用程序將無法充分利用可用的CPU資源。LOm28資訊網(wǎng)——每日最新資訊28at.com

Wait time: 這是***線程等待I/O操作完成的時間***。這可能包括***等待網(wǎng)絡響應、數(shù)據(jù)庫查詢或文件操作。***LOm28資訊網(wǎng)——每日最新資訊28at.com

Service time: 這是***線程執(zhí)行計算的時間***。LOm28資訊網(wǎng)——每日最新資訊28at.com

Blocking coefficient: 這是等待時間與服務時間的比率。這是衡量線程等待I/O操作完成所花費的時間與執(zhí)行計算所花費的時間之間關系的指標。LOm28資訊網(wǎng)——每日最新資訊28at.com

6 示例

假設你有一臺具有4個CPU核心的服務器,并且你希望你的應用程序使用可用CPU資源的50%。LOm28資訊網(wǎng)——每日最新資訊28at.com

你的應用程序有兩類任務:I/O密集型任務和CPU密集型任務。LOm28資訊網(wǎng)——每日最新資訊28at.com

I/O密集型任務的阻塞系數(shù)為0.5,意味著它們花費50%的時間等待I/O操作完成。LOm28資訊網(wǎng)——每日最新資訊28at.com

線程數(shù) = 4個核心 * 0.5 * (1 + 0.5) = 3個線程LOm28資訊網(wǎng)——每日最新資訊28at.com

CPU密集型任務的阻塞系數(shù)為0.1,意味著它們花費10%的時間等待I/O操作完成。LOm28資訊網(wǎng)——每日最新資訊28at.com

線程數(shù) = 4個核心 * 0.5 * (1 + 0.1) = 2.2個線程LOm28資訊網(wǎng)——每日最新資訊28at.com

在這個例子中,你將創(chuàng)建兩個線程池,一個用于I/O密集型任務,一個用于CPU密集型任務。I/O密集型線程池將有3個線程,而CPU密集型線程池將有2個線程。LOm28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-58899-0.html線程池系統(tǒng)設置最全指南!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Net開發(fā),跨線程安全通信,注意那些容易出錯的地方

下一篇: 在Rust中編寫自動化測試

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產(chǎn)品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發(fā)布會上看到了iQOO的首款平板產(chǎn)品iQOO Pad。雖
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經(jīng)開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • Android 14發(fā)布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發(fā)布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發(fā)布了Androi
  • 滴滴違法違規(guī)被罰80.26億 共存在16項違法事實

    滴滴違法違規(guī)被罰80.26億 存在16項違法事實開始于2121年7月,歷經(jīng)一年時間,網(wǎng)絡安全審查辦公室對“滴滴出行”網(wǎng)絡安全審查終于有了一個暫時的結束。據(jù)“網(wǎng)信
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現(xiàn)在已經(jīng)可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據(jù)10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業(yè)領先的性能,令人印象深刻的電池續(xù)航,精美豐
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現(xiàn)場,成為了展會的一大看點。這也是三翼鳥繼9月9日發(fā)布了行業(yè)首個一站式定制智慧家平臺后的
Top 主站蜘蛛池模板: 华容县| 湖南省| 成安县| 河南省| 溧阳市| 娄烦县| 包头市| 巴楚县| 巴中市| 亳州市| 澄江县| 齐齐哈尔市| 大埔县| 道真| 嘉兴市| 崇州市| 大理市| 旬邑县| 富阳市| 谷城县| 宁远县| 玉树县| 甘孜| 印江| 新宾| 米脂县| 德钦县| 麻江县| 阳西县| 青田县| 郓城县| 和林格尔县| 黄陵县| 漯河市| 文安县| 成都市| 手游| 光泽县| 永登县| 正定县| 苍山县|