溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java并發(fā)線程個數(shù)的怎么確定

發(fā)布時間:2021-12-20 14:22:59 來源:億速云 閱讀:173 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“java并發(fā)線程個數(shù)的怎么確定”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“java并發(fā)線程個數(shù)的怎么確定”吧!

java 并發(fā)線程個數(shù)的確定

本文從控制變量的角度來談決定線程個數(shù)的依據(jù)。模型很簡單,在實際的生產(chǎn)環(huán)境中,情況肯定比下文要復(fù)雜的多。要充分的進行測試,以使線程個數(shù)為優(yōu)。

java應(yīng)用程序大概分為兩種:cpu密集型和io密集型。

cpu密集型

就是指線程大部分時間都在用cpu,一般來說,普通的操作都需要用到cpu,比如計算,讀取,循環(huán),賦值,查詢,排序等等。在最理想的情況下,大牛們建議將線程數(shù)設(shè)置為count(cpu)+-1

io密集型

io操作一般不需要cpu的參與,線程在io時,線程會被阻塞(線程的六個狀態(tài)之一就有Blocked)如果一個線程完成某項工作一共需要100ms,其中io需要80ms,cpu需要20ms(忽略其他時間).那么線程數(shù)應(yīng)該設(shè)立為5.

有鎖的情況

多線程為了安全,往往會加鎖。對于關(guān)鍵代碼(被頻繁調(diào)用的代碼),往往可以成為線程個數(shù)的依據(jù)之一。

對于全局鎖(比如static上鎖),無論多少個線程,代碼都是串行執(zhí)行的。這樣線程越多反而越不好。對于鎖粒度的越小,對于線程并發(fā)來說越有利。比如ConcurrentHashMap來說,分了16個segment,也就是加了16把鎖。

在理性的情況下,鎖粒度可以降低16倍,那么自然可以允許16個并發(fā)。最壞的情況是16個線程去爭用一個segment。這個線程的個數(shù)需要根據(jù)實際情況去調(diào)優(yōu)。

java 線程池線程數(shù)量確定思路

多線程可以快速執(zhí)行任務(wù)的原理

因為服務(wù)器是擁有多個處理器核心的。運行某進程時,如果只有一個線程,則只能調(diào)動一個處理器核心,其他處理器核心可能處于空閑狀態(tài)。如果是多線程,則可以調(diào)用多個處理器核心,用最大效率去處理任務(wù)。

創(chuàng)建線程池需要的參數(shù)

創(chuàng)建線程池一般需要參數(shù)有:核心線程數(shù),最大線程數(shù),線程銷毀時間,任務(wù)隊列,拒絕策略等。

線程池里的線程分為兩種,分別是核心線程和非核心線程。當線程池接收到任務(wù)時,會先創(chuàng)建核心線程數(shù)去處理任務(wù),直至待處理的任務(wù)數(shù)量超過任務(wù)隊列長度和核心線程數(shù)之和時,會繼續(xù)創(chuàng)建非核心線程直至最大線程數(shù)。

線程池接收到的任務(wù)數(shù)量在即將超過任務(wù)隊列長度和最大線程數(shù)之和時,會觸發(fā)拒絕策略處理該任務(wù)。

非核心線程在執(zhí)行完成后會立即銷毀,核心線程則會等待設(shè)置的銷毀時間后再進行銷毀。

當任務(wù)隊列長度足夠大時,核心線程數(shù)和最大線程數(shù)相等,不然不能觸發(fā)到創(chuàng)建非核心線程

確定線程數(shù)

線程數(shù)計算公式為:

Nthreads=NcpuUcpu(1+w/c) =Ncpu*(1+w/c)

其中 Nthreads:線程數(shù);Ncpu:處理器核心數(shù);Ucpu:處理器的使用百分比;W/C:等待時間與計算時間的比率

Ncpu可以通過以下代碼獲取

Runtime.getRuntime().availableProcessors()

等待時間與計算時間的比率

針對IO密集型的,阻塞耗時w一般都是計算耗時幾倍c,假設(shè)阻塞耗時=計算耗時的情況下,Nthreads=Ncpu*(1+1)=2Ncpu。所以這種情況下,考慮2倍的CPU核心數(shù)做為線程數(shù)

對于計算密集型的,阻塞耗時趨于0,即w/c趨于0,公式Nthreads = Ncpu。

線程數(shù)一般是處理器核心數(shù)的整數(shù)倍。線程數(shù)設(shè)置過多,在多任務(wù)并發(fā)情況下,則會影響服務(wù)器的整體運行速度;設(shè)置過少,則不能最大化應(yīng)用服務(wù)器性能。所以需要根據(jù)具體業(yè)務(wù)來具體調(diào)整。

到此,相信大家對“java并發(fā)線程個數(shù)的怎么確定”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI