本申請(qǐng)涉及通信技術(shù)領(lǐng)域,特別涉及一種線程獲取方法,以及一種線程獲取設(shè)備。
背景技術(shù):
在基于面向?qū)ο缶幊痰膽?yīng)用中,創(chuàng)建和銷毀對(duì)象是很費(fèi)時(shí)間的,因?yàn)閯?chuàng)建一個(gè)對(duì)象要獲取內(nèi)存資源或者其它更多資源。
例如,在基于Java編程技術(shù)的應(yīng)用中,JVM(JAVA Virtual Machine,JAVA虛擬機(jī))將試圖跟蹤每一個(gè)對(duì)象,以便能夠在對(duì)象銷毀后進(jìn)行垃圾回收。所以提高服務(wù)程序效率的一個(gè)手段就是盡可能減少創(chuàng)建和銷毀對(duì)象的次數(shù),特別是一些很耗資源的對(duì)象創(chuàng)建和銷毀。如何利用已有對(duì)象來服務(wù)就是一個(gè)需要解決的關(guān)鍵問題,于是產(chǎn)生了線程池技術(shù)。
線程池技術(shù)能有效減少多線程環(huán)境中資源的消耗,可以提高系統(tǒng)的處理能力。但是其缺陷是當(dāng)通過線程池并發(fā)獲得線程的時(shí)候,為保證同一個(gè)線程不會(huì)被兩個(gè)待執(zhí)行工作任務(wù)所同時(shí)獲取,需要進(jìn)行加鎖,排隊(duì)獲取線程,由此會(huì)造成獲取線程效率降低。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)?zhí)峁┮环N線程獲取方法及設(shè)備,在應(yīng)用程序獲取線程池中的線程執(zhí)行操作時(shí),盡量減少了任務(wù)與任務(wù)之間的資源爭用,提高了獲取執(zhí)行任務(wù)的線程的效率,進(jìn)而增強(qiáng)應(yīng)用程序的伸縮性和健壯性。
本申請(qǐng)實(shí)施例提供一種線程獲取方法,所述方法包括以下步驟:
在應(yīng)用服務(wù)器啟動(dòng)時(shí),將線程池劃分為多個(gè)線程集合;
當(dāng)確認(rèn)一個(gè)或多個(gè)待執(zhí)行用戶任務(wù)需要從所述線程池中獲取線程進(jìn)行執(zhí)行操作時(shí),分別確定各待執(zhí)行用戶任務(wù)所歸屬的線程集合;
分別判斷所確定的各線程集合中是否有空閑線程;
當(dāng)判斷當(dāng)前線程集合中有空閑線程時(shí),將所述空閑線程返回給歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)。
優(yōu)選的,所述在應(yīng)用服務(wù)器啟動(dòng)時(shí),將線程池劃分為多個(gè)線程集合之后,還包括:
為各所述線程集合設(shè)置最小線程數(shù)量和最大線程數(shù)量;
為各所述線程集合創(chuàng)建最小線程數(shù)量的線程;
初始化包含所述最小線程數(shù)量的線程的各所述線程集合。
優(yōu)選的,所述分別判斷所確定的各線程集合中是否有空閑線程之后,還包括:
當(dāng)判斷當(dāng)前線程集合中沒有空閑線程時(shí),判斷在所述當(dāng)前線程集合中執(zhí)行操作的用戶任務(wù)數(shù)量是否大于為所述線程集合設(shè)置的最大線程數(shù)量;
如果沒有大于,則在所述當(dāng)前線程集合中創(chuàng)建一個(gè)線程,供歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)使用;
如果大于,則根據(jù)預(yù)設(shè)的線程替換規(guī)則,判斷在所述線程池中的其他線程集合中是否可以為所述待執(zhí)行的用戶任務(wù)獲取線程,如果可以,則將獲取到的線程返回給所述待執(zhí)行用戶任務(wù),如果不可以,則返回異常提示消息。
優(yōu)選的,所述根據(jù)預(yù)設(shè)的線程替換規(guī)則,判斷在所述線程池中的其他線程集合中是否可以為所述待執(zhí)行的用戶任務(wù)獲取線程,如果可以,則將獲取到的線程返回給所述待執(zhí)行用戶任務(wù),如果不可以,則返回異常提示消息,具體為:
根據(jù)預(yù)設(shè)的順序或隨機(jī)在所述線程池中選擇一個(gè)替換線程集合;
如果所述替換線程集合中當(dāng)前包含空閑線程,則將所述空閑線程返回給所述待執(zhí)行用戶任務(wù),并記錄所述待執(zhí)行用戶任務(wù)所使用的所述空閑線程所屬的線程集合及其在所述線程池中的位置;
如果所述替換線程集合中當(dāng)前沒有包含空閑線程,則判斷所述替換線程集合是否可以創(chuàng)建新的線程,如果可以,則創(chuàng)建新的線程,并將所述新的線程返回給所述待執(zhí)行用戶任務(wù),并記錄所述待執(zhí)行用戶任務(wù)所使用的所述新的線程所屬的線程集合及其在所述線程池中的位置;
如果所述替換線程集合不能創(chuàng)建新的線程,則繼續(xù)選擇下一個(gè)替換線程集合嘗試尋找空閑線程或創(chuàng)建新的線程給所述待執(zhí)行用戶任務(wù);
當(dāng)所述線程池中的所有線程集合都無法為所述待執(zhí)行任務(wù)提供空閑線程或創(chuàng)建新的線程時(shí),返回異常提示消息。
優(yōu)選的,所述判斷所述替換線程集合是否可以創(chuàng)建新的線程,具體為:
根據(jù)所述替換線程集合中的當(dāng)前線程數(shù)量以及為各所述線程集合設(shè)置最大線程數(shù)量,判斷所述替換線程集合是否可以創(chuàng)建新的線程
當(dāng)所述替換線程集合中的當(dāng)前線程數(shù)量小于為各所述線程集合設(shè)置最大線程數(shù)量時(shí),則確定所述替換線程集合可以創(chuàng)建新的線程;
當(dāng)所述替換線程集合中的當(dāng)前線程數(shù)量等于或大于為各所述線程集合設(shè)置最大線程數(shù)量時(shí),則確定所述替換線程集合不可以創(chuàng)建新的線程。
優(yōu)選的,所述分別確定各待執(zhí)行用戶任務(wù)所歸屬的線程集合,具體包括:
分別獲取當(dāng)前所接收到的各待執(zhí)行用戶任務(wù)的ID;
分別根據(jù)所述各待執(zhí)行用戶任務(wù)的ID對(duì)所述線程池中所劃分的線程集合個(gè)數(shù)進(jìn)行取模;
根據(jù)相應(yīng)的取模結(jié)果分別確定所述各待執(zhí)行用戶任務(wù)所歸屬的線程集合。
另一方面,本申請(qǐng)還提供了一種線程獲取設(shè)備,包括:
線程管理模塊,用于在應(yīng)用服務(wù)器啟動(dòng)時(shí),將線程池劃分為多個(gè)線程集合;
定位模塊,用于當(dāng)確認(rèn)用戶任務(wù)需要從所述線程池中獲取線程進(jìn)行執(zhí)行操作時(shí),在所述線程管理模塊所劃分的各線程集合中,分別確定各待執(zhí)行用戶任務(wù)所歸屬的線程集合;
判斷模塊,用于分別判斷所述定位模塊所確定的各線程集合中是否有空閑線程;
處理模塊,用于當(dāng)所述判斷模塊判斷當(dāng)前線程集合中有空閑線程時(shí),將所述空閑線程返回給歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)。
優(yōu)選的,所述線程管理模塊,還用于:
在將所述線程池劃分為多個(gè)線程集合之后,為各所述線程集合設(shè)置最小線程數(shù)量和最大線程數(shù)量;
為各所述線程集合創(chuàng)建最小線程數(shù)量的線程;
初始化包含所述最小線程數(shù)量的線程的各所述線程集合。
優(yōu)選的,所述處理模塊,具體用于:
所述判斷模塊,還用于當(dāng)判斷所述當(dāng)前線程集合中沒有空閑線程時(shí),判斷在所述當(dāng)前線程集合中執(zhí)行操作的用戶任務(wù)數(shù)量是否大于所述線程管理模塊為所述線程集合設(shè)置的最大線程數(shù)量;
所述處理模塊,還用于在所述判斷模塊的判斷結(jié)果為沒有大于時(shí),在所述當(dāng)前線程集合中創(chuàng)建一個(gè)線程,供歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)使用,或在所述判斷模塊的判斷結(jié)果為大于時(shí),根據(jù)預(yù)設(shè)的線程替換規(guī)則,判斷在所述線程池中的其他線程集合中是否可以為所述待執(zhí)行的用戶任務(wù)獲取線程,如果可以,則將獲取到的線程返回給所述待執(zhí)行用戶任務(wù),如果不可以,則返回異常提示消息。
優(yōu)選的,所述定位模塊,具體用于:
分別獲取當(dāng)前所接收到的各待執(zhí)行用戶任務(wù)的ID;
分別根據(jù)所述各待執(zhí)行用戶任務(wù)的ID對(duì)所述線程管理模塊在所述線程池中所劃分的線程集合個(gè)數(shù)進(jìn)行取模;
根據(jù)相應(yīng)的取模結(jié)果分別確定所述各待執(zhí)行用戶任務(wù)所歸屬的線程集合。
與現(xiàn)有技術(shù)相比,本申請(qǐng)實(shí)施例所提出的技術(shù)方案具有以下優(yōu)點(diǎn):
通過應(yīng)用本申請(qǐng)實(shí)施例所提出的技術(shù)方案,解決了現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。本申請(qǐng)實(shí)施例所提出的技術(shù)方案在應(yīng)用程序獲取線程池中的線程執(zhí)行操作時(shí),不需要進(jìn)行加鎖,盡量減少了任務(wù)與任務(wù)之間的資源爭用,提高了獲取執(zhí)行任務(wù)的線程的效率,進(jìn)而增強(qiáng)應(yīng)用程序的伸縮性和健壯性。
附圖說明
為了更加清楚地說明本申請(qǐng)實(shí)施例的技術(shù)方案,下面將對(duì)本申請(qǐng)實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請(qǐng)的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)本申請(qǐng)實(shí)施例的這些附圖獲得其他的附圖。
圖1為本申請(qǐng)實(shí)施例所提出的一種線程獲取方法的流程示意圖;
圖2為本申請(qǐng)實(shí)施例所提出的一種具體實(shí)施例中線程獲取方法的流程示意圖;
圖3為本申請(qǐng)實(shí)施例所提出的一種線程獲取設(shè)備的結(jié)構(gòu)示意圖。
具體實(shí)施方式
正如本申請(qǐng)背景技術(shù)所陳述的,現(xiàn)有方案中,在通過線程池并發(fā)獲得線程時(shí),需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而,導(dǎo)致獲取線程效率低下。
為克服現(xiàn)有技術(shù)中的缺陷,本申請(qǐng)實(shí)施例提出了一種線程獲取方法解決了現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。
實(shí)施例一
如圖1所示,為本申請(qǐng)實(shí)施例所提出的一種線程獲取方法的流程示意圖,該方法具體包括以下步驟:
步驟S101、在應(yīng)用服務(wù)器啟動(dòng)時(shí),將線程池劃分為多個(gè)線程集合。
在具體的應(yīng)用場景中,為了實(shí)現(xiàn)后續(xù)的線程處理,在本步驟進(jìn)行線程集合劃分之后,還包括以下處理:
首先,為所劃分的各所述線程集合設(shè)置最小線程數(shù)量和最大線程數(shù)量。
根據(jù)設(shè)置結(jié)果,為各所述線程集合創(chuàng)建最小線程數(shù)量的線程,然后,初始化包含所述最小線程數(shù)量的線程的各所述線程集合。
需要說明的是,在上述處理中,之所以在本申請(qǐng)實(shí)施例中只是創(chuàng)建最小線程數(shù)量的線程,原因具體如下:
首先,在線程池技術(shù)中,創(chuàng)建線程是一個(gè)很耗費(fèi)計(jì)算機(jī)資源的工作,所以,應(yīng)該盡量減少線程創(chuàng)建操作。但如果預(yù)先不進(jìn)行線程的創(chuàng)建,而是在有任務(wù)來臨的時(shí)候才進(jìn)行線程創(chuàng)建的話,則響應(yīng)時(shí)間中將會(huì)包含線程創(chuàng)建這一步所損耗的時(shí)間,從而,會(huì)使得響應(yīng)時(shí)間變慢。
基于上述考慮,本申請(qǐng)實(shí)施例所提出的技術(shù)方案在服務(wù)啟動(dòng)時(shí),便預(yù)先創(chuàng)建一個(gè)最小線程數(shù)量的線程,以此來滿足日常需求,從而,在一般情況下,當(dāng)接收到用戶任務(wù)時(shí),可以直接利用已創(chuàng)建的線程,而不需要再新建線程。
另一方面,設(shè)置最大線程數(shù)量是因?yàn)椋喝绻蝿?wù)突然暴增,而此時(shí)最小線程明顯不夠使用,則服務(wù)器會(huì)新創(chuàng)建線程來實(shí)現(xiàn)更好的響應(yīng),但是,因?yàn)橛?jì)算機(jī)資源也是有限的,因此,會(huì)規(guī)定一個(gè)最大線程數(shù)量,一旦超過這一數(shù)量,則不會(huì)繼續(xù)創(chuàng)建新的線程,因?yàn)樵賱?chuàng)建的話,會(huì)使得應(yīng)用服務(wù)器的服務(wù)能力下降。
因此,對(duì)于本申請(qǐng)實(shí)施例所提出的技術(shù)方案,在一般情況下,會(huì)在應(yīng)用服務(wù)器啟動(dòng)時(shí),對(duì)每個(gè)線程集合創(chuàng)建最小線程數(shù)量的線程,而如果任務(wù)數(shù)量暴增,則會(huì)在線程池中創(chuàng)建新的線程供新任務(wù)使用,但是不會(huì)創(chuàng)建超過最大線程數(shù)量的線程。
在完成本步驟的處理之后,當(dāng)確認(rèn)一個(gè)或多個(gè)待執(zhí)行用戶任務(wù)需要從所述線程池中獲取線程進(jìn)行執(zhí)行操作時(shí),執(zhí)行步驟S102。
步驟S102、分別確定各待執(zhí)行用戶任務(wù)所歸屬的線程集合。
具體的,本步驟的處理可以為:
分別獲取當(dāng)前所接收到的各待執(zhí)行用戶任務(wù)的ID;
分別根據(jù)所述各待執(zhí)行用戶任務(wù)的ID對(duì)所述線程池中所劃分的線程集合個(gè)數(shù)進(jìn)行取模;
根據(jù)相應(yīng)的取模結(jié)果分別確定所述各待執(zhí)行用戶任務(wù)所歸屬的線程集合。
在本實(shí)施例中由于在應(yīng)用服務(wù)器啟動(dòng)時(shí),就創(chuàng)建了一個(gè)由多個(gè)所述線程集合所組成的線程池;當(dāng)確認(rèn)用戶任務(wù)需要獲取線程進(jìn)行執(zhí)行操作時(shí),可以根據(jù)不同的用戶任務(wù)的ID定位不同的線程集合,從而使得在通過線程池并發(fā)獲得線程的時(shí)候,不需要進(jìn)行加鎖判斷線程是否空閑,為進(jìn)一步獲取線程的提高了效率。
步驟S103、分別判斷所確定的各線程集合中是否有空閑線程。
當(dāng)判斷當(dāng)前線程集合中有空閑線程時(shí),執(zhí)行步驟S104。
步驟S104、將所述空閑線程返回給歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)。
通過上述的處理,可以實(shí)現(xiàn)在存在空閑線程的情況下,為歸屬到每個(gè)線程集合中的待執(zhí)行用戶任務(wù)分配相應(yīng)的空閑線程的處理,從而,即使在多線程并發(fā)的情況下,也可以通過多個(gè)線程集合來實(shí)現(xiàn)各待執(zhí)行用戶任務(wù)的線程分配,從而可以解決現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。
為了更加完整的說明本申請(qǐng)實(shí)施例所提出的技術(shù)方案,本實(shí)施例進(jìn)一步說明在步驟S103中,當(dāng)前線程集合中沒有空閑線程時(shí)的后續(xù)處理過程,具體說明如下:
當(dāng)判斷當(dāng)前線程集合中沒有空閑線程時(shí),判斷在所述當(dāng)前線程集合中執(zhí)行操作的用戶任務(wù)數(shù)量是否大于步驟S101中為所述線程集合設(shè)置的最大線程數(shù)量。
如果沒有大于,,說明此時(shí)的線程集合還未飽和,則在所述當(dāng)前線程集合中創(chuàng)建一個(gè)線程,供歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)使用。
如果大于,說明此時(shí)的當(dāng)前線程集合已經(jīng)飽和,則根據(jù)預(yù)設(shè)的線程替換規(guī)則,判斷在所述線程池中的其他線程集合中是否可以為所述待執(zhí)行的用戶任務(wù)獲取線程,如果可以,則將獲取到的線程返回給所述待執(zhí)行用戶任務(wù),如果不可以,則返回異常提示消息。
為了充分利用線程池中的線程資源,在當(dāng)前線程集合沒有資源可以創(chuàng)建線程的情況下,可以調(diào)用其他線程集合中的線程資源,而為了整體資源的合理調(diào)度,本申請(qǐng)實(shí)施例進(jìn)一步引入了上述的線程替換規(guī)則,在具體的應(yīng)用場景中,上述的應(yīng)用線程出處理過程具體可以如下:
首先,根據(jù)預(yù)設(shè)的順序或隨機(jī)在所述線程池中選擇一個(gè)替換線程集合。
如果所述替換線程集合中當(dāng)前包含空閑線程,則將所述空閑線程返回給所述待執(zhí)行用戶任務(wù),并記錄所述待執(zhí)行用戶任務(wù)所使用的所述空閑線程所屬的線程集合及其在所述線程池中的位置。
如果所述替換線程集合中當(dāng)前沒有包含空閑線程,則判斷所述替換線程集合是否可以創(chuàng)建新的線程。
如果所述替換線程集合可以創(chuàng)建新的線程,則創(chuàng)建新的線程,并將所述新的線程返回給所述待執(zhí)行用戶任務(wù),并記錄所述待執(zhí)行用戶任務(wù)所使用的所述新的線程所屬的線程集合及其在所述線程池中的位置。
如果所述替換線程集合不能創(chuàng)建新的線程,則繼續(xù)選擇下一個(gè)替換線程集合嘗試尋找空閑線程或創(chuàng)建新的線程給所述待執(zhí)行用戶任務(wù)。
當(dāng)所述線程池中的所有線程集合都無法為所述待執(zhí)行任務(wù)提供空閑線程或創(chuàng)建新的線程時(shí),返回異常提示消息。
在具體的應(yīng)用場景中,上述的判斷所述替換線程集合是否可以創(chuàng)建新的線程的操作,可以按照以下方式來實(shí)現(xiàn):
根據(jù)所述替換線程集合中的當(dāng)前線程數(shù)量以及為各所述線程集合設(shè)置最大線程數(shù)量,說明此時(shí)的所述替換線程集合還未飽和,則判斷所述替換線程集合是否可以創(chuàng)建新的線程。
當(dāng)所述替換線程集合中的當(dāng)前線程數(shù)量小于為各所述線程集合設(shè)置最大線程數(shù)量時(shí),則確定所述替換線程集合可以創(chuàng)建新的線程。
當(dāng)所述替換線程集合中的當(dāng)前線程數(shù)量等于或大于為各所述線程集合設(shè)置最大線程數(shù)量時(shí),則確定所述替換線程集合不可以創(chuàng)建新的線程。
在具體的應(yīng)用場景中,判斷線程池中的其他線程集合是否包含空閑線程,以及在沒有空閑線程的情況下是否可以創(chuàng)建新線程的操作,為充分利用線程池中的線程資源提供了一套可以實(shí)現(xiàn)分層演進(jìn)的資源替代方案,而且相應(yīng)的替換操作在一定時(shí)間區(qū)間內(nèi)會(huì)集中在一個(gè)線程集合中進(jìn)行,這不會(huì)干擾其他 線程集合的正常操作,無需像現(xiàn)有技術(shù)一樣進(jìn)行加鎖和排隊(duì)的處理,提高了并發(fā)線程的場景下,資源調(diào)度和分配的效率。
通過應(yīng)用本申請(qǐng)實(shí)施例所提出的技術(shù)方案,解決了現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。本申請(qǐng)實(shí)施例所提出的技術(shù)方案在應(yīng)用程序獲取線程池中的線程執(zhí)行操作時(shí),不需要進(jìn)行加鎖,盡量減少了任務(wù)與任務(wù)之間的資源爭用,提高了獲取執(zhí)行任務(wù)的線程的效率,進(jìn)而增強(qiáng)應(yīng)用程序的伸縮性和健壯性。
實(shí)施例二
為了進(jìn)一步闡述本申請(qǐng)的技術(shù)方案,現(xiàn)結(jié)合具體的應(yīng)用場景,對(duì)本申請(qǐng)的技術(shù)方案進(jìn)行說明,如圖2所示,本實(shí)施例提出的一種線程獲取方法,應(yīng)用于應(yīng)用服務(wù)器中,該方法具體包括以下步驟:
步驟S201,在應(yīng)用服務(wù)器啟動(dòng)時(shí)創(chuàng)建一個(gè)線程池,所述線程池由多個(gè)線程集合組成,為各所述線程集合創(chuàng)建最小線程數(shù)量的線程,然后,初始化包含所述最小線程數(shù)量的線程的各所述線程集合。
在本申請(qǐng)優(yōu)選地實(shí)施例中,在應(yīng)用服務(wù)啟動(dòng)時(shí),創(chuàng)建一個(gè)由多個(gè)線程集合組成的線程池相當(dāng)于將原來的一個(gè)大的線程集合,分為幾個(gè)小的線程集合,這幾個(gè)小的線程集合組成一個(gè)線程池,當(dāng)確定用戶任務(wù)需要獲取用戶任務(wù)時(shí),可以根據(jù)不同的用戶任務(wù)ID定位到不同的線程集合中,從而使得不同的用戶任務(wù)并發(fā)獲取線程的過程中不需要進(jìn)行加鎖,提高了線程獲取的效率。
在應(yīng)用服務(wù)啟動(dòng)時(shí),之所以先為各所述線程集合創(chuàng)建最小線程數(shù)量的線程,是因?yàn)閯?chuàng)建線程是一個(gè)很耗費(fèi)計(jì)算機(jī)資源的工作,當(dāng)有任務(wù)來臨,在創(chuàng)建線程,則響應(yīng)時(shí)間中包含線程創(chuàng)建這一步,會(huì)使得響應(yīng)時(shí)間變慢,因此在應(yīng)用服務(wù)啟動(dòng)時(shí),先為各所述線程集合創(chuàng)建最小線程數(shù)量的線程,此時(shí)滿足 日常需求,如果有應(yīng)用任務(wù)需要獲取線程,則可以直接利用線程,不需要再臨時(shí)新建線程。
在應(yīng)用服務(wù)啟動(dòng)時(shí),之所以設(shè)置最大線程數(shù)量,是為了使應(yīng)用服務(wù)器在現(xiàn)有的服務(wù)能力范圍內(nèi)更好的工作。例如,如果在應(yīng)用服務(wù)器啟動(dòng)時(shí),為線程集合設(shè)置了10個(gè)最小線程數(shù)量,當(dāng)用戶任務(wù)需要獲取的線程數(shù)量突然增加,例如需要500個(gè)線程,此時(shí)最小線程數(shù)量明顯不夠使用,則應(yīng)用服務(wù)器會(huì)創(chuàng)建新的線程來更好的響應(yīng),但是因?yàn)橛?jì)算機(jī)資源也是有限的,因此需要給個(gè)線程集合設(shè)定一個(gè)最大線程數(shù)量,比如設(shè)置最大線程數(shù)量為100,則即使超過100,也不會(huì)再在該線程集合中創(chuàng)建新的線程,因?yàn)樵賱?chuàng)建新的線程,會(huì)使得應(yīng)用服務(wù)器的服務(wù)能力下降。因此,設(shè)置最大線程數(shù)量是為了使應(yīng)用服務(wù)器在現(xiàn)有的服務(wù)能力范圍內(nèi)更好的工作。
步驟S202,當(dāng)確認(rèn)用戶任務(wù)需要獲取線程進(jìn)行執(zhí)行操作時(shí),根據(jù)所述用戶任務(wù)的ID定位所述線程池中的所述線程集合。
在本申請(qǐng)優(yōu)選的實(shí)施例中,所述根據(jù)所述用戶任務(wù)的ID定位線程池中的線程集合,具體包括:
根據(jù)所述用戶任務(wù)的ID對(duì)所述線程池中的線程集合個(gè)數(shù)進(jìn)行取模,獲得模值,根據(jù)所述模值定位相應(yīng)的線程集合。從而使得不同的用戶任務(wù)定位到不同的相應(yīng)的線程集合中。使得不同的用戶任務(wù)并發(fā)獲取線程的過程中不需要進(jìn)行加鎖,提高了線程獲取的效率。
步驟S203,判斷所述線程集合中是否有空閑線程。
當(dāng)所述線程集合中有空閑線程時(shí),執(zhí)行步驟S204;
當(dāng)所述線程集合中沒有空閑線程,執(zhí)行步驟S205。
步驟S204,將所述空閑線程返回給用戶任務(wù)。
步驟S205,判斷是否可以在所述線程集合中創(chuàng)建新的線程任務(wù)。
所述判斷依據(jù)為當(dāng)前執(zhí)行操作的用戶任務(wù)數(shù)小于為所述線程集合設(shè)置的 最大線程數(shù)量。
若可以在所述線程集合中創(chuàng)建新的線程任務(wù),則執(zhí)行步驟S206;
若不可以在所述線程集合中創(chuàng)建新的線程任務(wù),則執(zhí)行步驟S207。
步驟S206,創(chuàng)建一個(gè)線程供用戶任務(wù)使用。
步驟S207,判斷所述線程池中的其他線程集合中是否包含空閑線程。
若所述線程池中的其他線程集合中包含空閑線程,則執(zhí)行步驟S208;
若所述線程池中的其他線程集合中不包含空閑線程,則執(zhí)行步驟S209。
步驟S208,將所述空閑線程返回給用戶任務(wù),并記錄當(dāng)前用戶任務(wù)使用線程所屬的線程集合及其在所述線程池中的位置。
步驟S209,判斷是否可以在所述線程池中的其他線程集合中創(chuàng)建新的線程;
所述判斷依據(jù)為所述其他線程集合中的線程數(shù)是否小于為所述其他線程集合設(shè)置的最大線程數(shù)量。
若可以在所述線程池中的其他線程集合中創(chuàng)建新的線程,則執(zhí)行步驟S210;
若不可以在所述線程池中的其他線程集合中創(chuàng)建新的線程,則執(zhí)行步驟S211。
步驟S210,創(chuàng)建新的線程,將所述新的線程返回給用戶任務(wù),并記錄當(dāng)前用戶任務(wù)使用線程所屬的線程集合及其在所述線程池中的位置。
步驟S211,顯示當(dāng)前沒有可用線程的異常說明。
通過應(yīng)用本申請(qǐng)實(shí)施例所提出的技術(shù)方案,解決了現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。本申請(qǐng)實(shí)施例所提出的技術(shù)方案在應(yīng)用程序獲取線程池中的線程執(zhí)行操作時(shí),不需要進(jìn)行加鎖,盡量減少了任務(wù)與任 務(wù)之間的資源爭用,提高了獲取執(zhí)行任務(wù)的線程的效率,進(jìn)而增強(qiáng)應(yīng)用程序的伸縮性和健壯性。
實(shí)施例三
基于與上述線程獲取方法實(shí)現(xiàn)流程同樣的申請(qǐng)構(gòu)思,本申請(qǐng)實(shí)施例中還提供了一種線程獲取設(shè)備,如圖3所示,所述設(shè)備包括:
線程管理模塊31,用于在應(yīng)用服務(wù)器啟動(dòng)時(shí),將線程池劃分為多個(gè)線程集合;
定位模塊32,用于當(dāng)確認(rèn)用戶任務(wù)需要從所述線程池中獲取線程進(jìn)行執(zhí)行操作時(shí),在所述線程管理模塊31所劃分的各線程集合中,分別確定各待執(zhí)行用戶任務(wù)所歸屬的線程集合;
判斷模塊33,用于分別判斷所述定位模塊32所確定的各線程集合中是否有空閑線程;
處理模塊34,用于當(dāng)所述判斷模塊33判斷當(dāng)前線程集合中有空閑線程時(shí),將所述空閑線程返回給歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)。
在具體的應(yīng)用場景中,所述線程管理模塊31,還用于:
在將所述線程池劃分為多個(gè)線程集合之后,為各所述線程集合設(shè)置最小線程數(shù)量和最大線程數(shù)量;
為各所述線程集合創(chuàng)建最小線程數(shù)量的線程;
初始化包含所述最小線程數(shù)量的線程的各所述線程集合。
進(jìn)一步的,
所述判斷模塊33,還用于當(dāng)判斷所述當(dāng)前線程集合中沒有空閑線程時(shí),判斷在所述當(dāng)前線程集合中執(zhí)行操作的用戶任務(wù)數(shù)量是否大于所述線程管理模塊31為所述線程集合設(shè)置的最大線程數(shù)量;
所述處理模塊34,還用于在所述判斷模塊33的判斷結(jié)果為沒有大于時(shí), 在所述當(dāng)前線程集合中創(chuàng)建一個(gè)線程,供歸屬到所述當(dāng)前線程集合的待執(zhí)行用戶任務(wù)使用,或在所述判斷模塊33的判斷結(jié)果為大于時(shí),根據(jù)預(yù)設(shè)的線程替換規(guī)則,判斷在所述線程池中的其他線程集合中是否可以為所述待執(zhí)行的用戶任務(wù)獲取線程,如果可以,則將獲取到的線程返回給所述待執(zhí)行用戶任務(wù),如果不可以,則返回異常提示消息。
在具體的應(yīng)用場景中,所述定位模塊32,具體用于:
分別獲取當(dāng)前所接收到的各待執(zhí)行用戶任務(wù)的ID;
分別根據(jù)所述各待執(zhí)行用戶任務(wù)的ID對(duì)所述線程管理模塊31在所述線程池中所劃分的線程集合個(gè)數(shù)進(jìn)行取模;
根據(jù)相應(yīng)的取模結(jié)果分別確定所述各待執(zhí)行用戶任務(wù)所歸屬的線程集合。
通過應(yīng)用本申請(qǐng)實(shí)施例所提出的技術(shù)方案,解決了現(xiàn)有技術(shù)在通過線程池并發(fā)獲得線程的時(shí)候,需要進(jìn)行加鎖判斷線程是否空閑,排隊(duì)獲取線程,從而導(dǎo)致獲取線程效率低下的問題。本申請(qǐng)實(shí)施例所提出的技術(shù)方案在應(yīng)用程序獲取線程池中的線程執(zhí)行操作時(shí),不需要進(jìn)行加鎖,盡量減少了任務(wù)與任務(wù)之間的資源爭用,提高了獲取執(zhí)行任務(wù)的線程的效率,進(jìn)而增強(qiáng)應(yīng)用程序的伸縮性和健壯性。
其中,本申請(qǐng)裝置的各個(gè)模塊可以集成于一體,也可以分離部署。上述模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本申請(qǐng)可借助軟件加必需的通用硬件平臺(tái)的方式來實(shí)現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實(shí)施方式。基于這樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí) 施例所述的方法。本領(lǐng)域技術(shù)人員可以理解附圖只是一個(gè)優(yōu)選實(shí)施例的示意圖,附圖中的模塊或流程并不一定是實(shí)施本申請(qǐng)所必須的。本領(lǐng)域技術(shù)人員可以理解實(shí)施例中的裝置中的模塊可以按照實(shí)施例描述進(jìn)行分布于實(shí)施例的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施例的一個(gè)或多個(gè)裝置中。上述實(shí)施例的模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。上述本申請(qǐng)實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。以上公開的僅為本申請(qǐng)的幾個(gè)具體實(shí)施例,但是,本申請(qǐng)并非局限于此,任何本領(lǐng)域的技術(shù)人員能思之的變化都應(yīng)落入本申請(qǐng)的保護(hù)范圍。