java創(chuàng)建線程池代碼 java創(chuàng)建線程池實(shí)現(xiàn)方式

java 定義一個(gè)線程池 循環(huán)遍歷list,進(jìn)行讀寫操作

import?java.util.List;

創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為中牟企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作,中牟網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

import?java.util.concurrent.Callable;

import?java.util.concurrent.ExecutionException;

import?java.util.concurrent.ExecutorService;

import?java.util.concurrent.Executors;

import?java.util.concurrent.Future;

/**

*?并發(fā)處理器

*?適用于如下場(chǎng)景(舉例):

*?一個(gè)任務(wù)隊(duì)列,?有150個(gè)任務(wù)需要并發(fā)處理,使用此對(duì)象,可以每次并發(fā)執(zhí)行20次(可設(shè)置),則總共串行執(zhí)行8次并發(fā),可獲取執(zhí)行結(jié)果

*

*?@param?T?類型T限制為任務(wù)Callable使用的數(shù)據(jù)對(duì)象和返回結(jié)果的數(shù)據(jù)對(duì)象為同一個(gè)bean

*/

public?class?ConcurrentExcutorT

{

/**?非空,所有任務(wù)數(shù)組?*/

private?CallableT[]?tasks;

/**?非空,每次并發(fā)需要處理的任務(wù)數(shù)?*/

private?int?numb;

/**?可選,存放返回結(jié)果,這里有個(gè)限制,泛型T必須為Callable返回的類型T?*/

private?ListT?result;

/**

*?無參構(gòu)造

*/

public?ConcurrentExcutor()

{

super();

}

/**

*?不需要返回結(jié)果的任務(wù)用此創(chuàng)建對(duì)象

*?@param?tasks

*?@param?numb

*/

public?ConcurrentExcutor(CallableT[]?tasks,?int?numb)

{

super();

this.tasks?=?tasks;

this.numb?=?numb;

}

/**

*?需要結(jié)果集用此方法創(chuàng)建對(duì)象

*?@param?tasks

*?@param?numb

*?@param?result

*/

public?ConcurrentExcutor(CallableT[]?tasks,?int?numb,?ListT?result)

{

super();

this.tasks?=?tasks;

this.numb?=?numb;

this.result?=?result;

}

public?void?excute()

{

//?參數(shù)校驗(yàn)

if(tasks?==?null?||?numb??1)

{

return;

}

//?待處理的任務(wù)數(shù)

int?num?=?tasks.length;

if(num?==?0)

{

return;

}

//?第一層循環(huán),每numb條數(shù)據(jù)作為一次并發(fā)

for(int?i=0;?i(int)Math.floor(num/numb)?+?1;?i++)

{

//?用于記錄此次numb條任務(wù)的處理結(jié)果

Future[]?futureArray;

if(numb??num)

{

futureArray?=?new?Future[num];

}

else

{

futureArray?=?new?Future[numb];

}

//?創(chuàng)建線程容器

ExecutorService?es?=?Executors.newCachedThreadPool();

//?第二層循環(huán),針對(duì)這numb條數(shù)據(jù)進(jìn)行處理

for(int?j=i*numb;?j(i+1)*numb;?j++)

{

//?如果超出數(shù)組長(zhǎng)度,退出循環(huán)

if(j?+?1??num)

{

break;

}

//?執(zhí)行任務(wù),并設(shè)置Future到數(shù)組中

futureArray[j%numb]?=?es.submit(tasks[j]);

}

//?將結(jié)果放入result中

if?(result?!=?null)

{

for?(int?j?=?0;?j??futureArray.length;?j++)

{

try

{

if(futureArray[j]?!=?null)

{

Object?o?=?futureArray[j].get();

result.add((T)o);

}

}

catch?(InterruptedException?e)

{

System.out.println("處理Future時(shí)發(fā)生InterruptedException異常,目標(biāo)Future為:?"?+?futureArray[j].toString());

e.printStackTrace();

}

catch?(ExecutionException?e)

{

System.out.println("處理Future時(shí)發(fā)生ExecutionException異常,目標(biāo)Future為:?"?+?futureArray[j].toString());

e.printStackTrace();

}

}

}

es.shutdown();

}

}

java中ExecutorService的線程池如何暫停任務(wù)和繼續(xù)任務(wù)? 有這樣的函數(shù)嗎?

接口 java.util.concurrent.ExecutorService 表述了異步執(zhí)行的機(jī)制,并且可以讓任務(wù)在后臺(tái)執(zhí)行。一個(gè) ExecutorService 實(shí)例因此特別像一個(gè)線程池。事實(shí)上,在 java.util.concurrent 包中的 ExecutorService 的實(shí)現(xiàn)就是一個(gè)線程池的實(shí)現(xiàn)。

這里有一個(gè)簡(jiǎn)單的使用Java 實(shí)現(xiàn)的 ExectorService 樣例:

使用 newFixedThreadPool() 工廠方法創(chuàng)建一個(gè) ExecutorService ,上述代碼創(chuàng)建了一個(gè)可以容納10個(gè)線程任務(wù)的線程池。其次,向 execute() 方法中傳遞一個(gè)異步的 Runnable 接口的實(shí)現(xiàn),這樣做會(huì)讓 ExecutorService 中的某個(gè)線程執(zhí)行這個(gè) Runnable 線程。

【Java基礎(chǔ)】線程池的原理是什么?

什么是線程池?

總歸為:池化技術(shù) ---》數(shù)據(jù)庫連接池 緩存架構(gòu) 緩存池 線程池 內(nèi)存池,連接池,這種思想演變成緩存架構(gòu)技術(shù)--- JDK設(shè)計(jì)思想有千絲萬縷的聯(lián)系

首先我們從最核心的ThreadPoolExecutor類中的方法講起,然后再講述它的實(shí)現(xiàn)原理,接著給出了它的使用示例,最后討論了一下如何合理配置線程池的大小。

Java 中的 ThreadPoolExecutor 類

java.uitl.concurrent.ThreadPoolExecutor 類是線程池中最核心的一個(gè)類,因此如果要透徹地了解Java 中的線程池,必須先了解這個(gè)類。下面我們來看一下 ThreadPoolExecutor 類的具體實(shí)現(xiàn)源碼。

在 ThreadPoolExecutor 類中提供了四個(gè)構(gòu)造方法:

從上面的代碼可以得知,ThreadPoolExecutor 繼承了 AbstractExecutorService 類,并提供了四個(gè)構(gòu)造器,事實(shí)上,通過觀察每個(gè)構(gòu)造器的源碼具體實(shí)現(xiàn),發(fā)現(xiàn)前面三個(gè)構(gòu)造器都是調(diào)用的第四個(gè)構(gòu)造器進(jìn)行的初始化工作。

下面解釋下一下構(gòu)造器中各個(gè)參數(shù)的含義:

corePoolSize:核心池的大小,這個(gè)參數(shù)跟后面講述的線程池的實(shí)現(xiàn)原理有非常大的關(guān)系。在創(chuàng)建了線程池后,默認(rèn)情況下,線程池中并沒有任何線程,而是等待有任務(wù)到來才創(chuàng)建線程去執(zhí)行任務(wù),除非調(diào)用了prestartAllCoreThreads() 或者 prestartCoreThread()方法,從這 2 個(gè)方法的名字就可以看出,是預(yù)創(chuàng)建線程的意思,即在沒有任務(wù)到來之前就創(chuàng)建 corePoolSize 個(gè)線程或者一個(gè)線程。默認(rèn)情況下,在創(chuàng)建了線程池后,線程池中的線程數(shù)為0,當(dāng)有任務(wù)來之后,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù),當(dāng)線程池中的線程數(shù)目達(dá)到 corePoolSize 后,就會(huì)把到達(dá)的任務(wù)放到緩存隊(duì)列當(dāng)中;

maximumPoolSize:線程池最大線程數(shù),這個(gè)參數(shù)也是一個(gè)非常重要的參數(shù),它表示在線程池中最多能創(chuàng)建多少個(gè)線程;

keepAliveTime:表示線程沒有任務(wù)執(zhí)行時(shí)最多保持多久時(shí)間會(huì)終止。默認(rèn)情況下,只有當(dāng)線程池中的線程數(shù)大于 corePoolSize 時(shí),keepAliveTime 才會(huì)起作用,直到線程池中的線程數(shù)不大于 corePoolSize,即當(dāng)線程池中的線程數(shù)大于 corePoolSize 時(shí),如果一個(gè)線程空閑的時(shí)間達(dá)到 keepAliveTime,則會(huì)終止,直到線程池中的線程數(shù)不超過 corePoolSize。但是如果調(diào)用了 allowCoreThreadTimeOut(boolean) 方法,在線程池中的線程數(shù)不大于 corePoolSize 時(shí),keepAliveTime 參數(shù)也會(huì)起作用,直到線程池中的線程數(shù)為0;

unit:參數(shù) keepAliveTime 的時(shí)間單位,有 7 種取值,在 TimeUnit 類中有 7 種靜態(tài)屬性:

workQueue:一個(gè)阻塞隊(duì)列,用來存儲(chǔ)等待執(zhí)行的任務(wù),這個(gè)參數(shù)的選擇也很重要,會(huì)對(duì)線程池的運(yùn)行過程產(chǎn)生重大影響,一般來說,這里的阻塞隊(duì)列有以下幾種選擇:

ArrayBlockingQueue 和 PriorityBlockingQueue 使用較少,一般使用 LinkedBlockingQueue 和 Synchronous。線程池的排隊(duì)策略與 BlockingQueue 有關(guān)。

threadFactory:線程工廠,主要用來創(chuàng)建線程;

handler:表示當(dāng)拒絕處理任務(wù)時(shí)的策略,有以下四種取值:

具體參數(shù)的配置與線程池的關(guān)系將在下一節(jié)講述。

從上面給出的 ThreadPoolExecutor 類的代碼可以知道,ThreadPoolExecutor 繼承了AbstractExecutorService,我們來看一下 AbstractExecutorService 的實(shí)現(xiàn):

AbstractExecutorService 是一個(gè)抽象類,它實(shí)現(xiàn)了 ExecutorService 接口。

我們接著看 ExecutorService 接口的實(shí)現(xiàn):

而 ExecutorService 又是繼承了 Executor 接口,我們看一下 Executor 接口的實(shí)現(xiàn):

標(biāo)題名稱:java創(chuàng)建線程池代碼 java創(chuàng)建線程池實(shí)現(xiàn)方式
URL標(biāo)題:http://muchs.cn/article46/ddceheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、外貿(mào)建站營(yíng)銷型網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、虛擬主機(jī)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化