日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java excutorthread_Java中ThreadPoolExecutor的参数理解

發(fā)布時(shí)間:2023/12/4 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java excutorthread_Java中ThreadPoolExecutor的参数理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、使用Executors創(chuàng)建線程池

之前創(chuàng)建線程的時(shí)候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()這三個(gè)方法。當(dāng)然Executors也是用不同的參數(shù)去new ThreadPoolExecutor

1.?newFixedThreadPool()

創(chuàng)建線程數(shù)固定大小的線程池。 由于使用了LinkedBlockingQueue所以maximumPoolSize 沒用,當(dāng)corePoolSize滿了之后就加入到LinkedBlockingQueue隊(duì)列中。每當(dāng)某個(gè)線程執(zhí)行完成之后就從LinkedBlockingQueue隊(duì)列中取一個(gè)。所以這個(gè)是創(chuàng)建固定大小的線程池。

public?static?ExecutorService?newFixedThreadPool(int?nThreads)?{

return?new?ThreadPoolExecutor(nThreads,?nThreads,

0L,?TimeUnit.MILLISECONDS,

new?LinkedBlockingQueue());

}

public?ThreadPoolExecutor(int?corePoolSize,

int?maximumPoolSize,

long?keepAliveTime,

TimeUnit?unit,

BlockingQueue?workQueue)?{

this(corePoolSize,?maximumPoolSize,?keepAliveTime,?unit,?workQueue,

Executors.defaultThreadFactory(),?defaultHandler);

}

2.newSingleThreadPool()

創(chuàng)建線程數(shù)為1的線程池,由于使用了LinkedBlockingQueue所以maximumPoolSize 沒用,corePoolSize為1表示線程數(shù)大小為1,滿了就放入隊(duì)列中,執(zhí)行完了就從隊(duì)列取一個(gè)。

public?static?ExecutorService?newSingleThreadExecutor()?{

return?new?FinalizableDelegatedExecutorService

(new?ThreadPoolExecutor(1,?1,

0L,?TimeUnit.MILLISECONDS,

new?LinkedBlockingQueue()));

}

3.newCachedThreadPool()

創(chuàng)建可緩沖的線程池。沒有大小限制。由于corePoolSize為0所以任務(wù)會(huì)放入SynchronousQueue隊(duì)列中,SynchronousQueue只能存放大小為1,所以會(huì)立刻新起線程,由于maxumumPoolSize為Integer.MAX_VALUE所以可以認(rèn)為大小為2147483647。受內(nèi)存大小限制。

public?static?ExecutorService?newCachedThreadPool()?{

return?new?ThreadPoolExecutor(0,?Integer.MAX_VALUE,

60L,?TimeUnit.SECONDS,

new?SynchronousQueue());

}

public?ThreadPoolExecutor(int?corePoolSize,

int?maximumPoolSize,

long?keepAliveTime,

TimeUnit?unit,

BlockingQueue?workQueue)?{

this(corePoolSize,?maximumPoolSize,?keepAliveTime,?unit,?workQueue,

Executors.defaultThreadFactory(),?defaultHandler);

}

二、使用ThreadPoolExecutor創(chuàng)建線程池

ThreadPoolExecutor的構(gòu)造函數(shù)

public?ThreadPoolExecutor(int?corePoolSize,

int?maximumPoolSize,

long?keepAliveTime,

TimeUnit?unit,

BlockingQueue?workQueue,

ThreadFactory?threadFactory,

RejectedExecutionHandler?handler)?{

if?(corePoolSize?

maximumPoolSize?<=?0?||

maximumPoolSize?

keepAliveTime?

throw?new?IllegalArgumentException();

if?(workQueue?==?null?||?threadFactory?==?null?||?handler?==?null)

throw?new?NullPointerException();

this.corePoolSize?=?corePoolSize;

this.maximumPoolSize?=?maximumPoolSize;

this.workQueue?=?workQueue;

this.keepAliveTime?=?unit.toNanos(keepAliveTime);

this.threadFactory?=?threadFactory;

this.handler?=?handler;

}

參數(shù):

1、corePoolSize核心線程數(shù)大小,當(dāng)線程數(shù)

2、maximumPoolSize 最大線程數(shù), 當(dāng)線程數(shù) >= corePoolSize的時(shí)候,會(huì)把runnable放入workQueue中

3、keepAliveTime ?保持存活時(shí)間,當(dāng)線程數(shù)大于corePoolSize的空閑線程能保持的最大時(shí)間。

4、unit 時(shí)間單位

5、workQueue 保存任務(wù)的阻塞隊(duì)列

6、threadFactory 創(chuàng)建線程的工廠

7、handler 拒絕策略

任務(wù)執(zhí)行順序:

1、當(dāng)線程數(shù)小于corePoolSize時(shí),創(chuàng)建線程執(zhí)行任務(wù)。

2、當(dāng)線程數(shù)大于等于corePoolSize并且workQueue沒有滿時(shí),放入workQueue中

3、線程數(shù)大于等于corePoolSize并且當(dāng)workQueue滿時(shí),新任務(wù)新建線程運(yùn)行,線程總數(shù)要小于maximumPoolSize

4、當(dāng)線程總數(shù)等于maximumPoolSize并且workQueue滿了的時(shí)候執(zhí)行handler的rejectedExecution。也就是拒絕策略。

ThreadPoolExecutor默認(rèn)有四個(gè)拒絕策略:

1、ThreadPoolExecutor.AbortPolicy() ? 直接拋出異常RejectedExecutionException

2、ThreadPoolExecutor.CallerRunsPolicy()????直接調(diào)用run方法并且阻塞執(zhí)行

3、ThreadPoolExecutor.DiscardPolicy() ? 直接丟棄后來的任務(wù)

4、ThreadPoolExecutor.DiscardOldestPolicy() ?丟棄在隊(duì)列中隊(duì)首的任務(wù)

當(dāng)然可以自己繼承RejectedExecutionHandler來寫拒絕策略.

int?corePoolSize?=?1;

int?maximumPoolSize?=?2;

int?keepAliveTime?=?10;

//BlockingQueue?workQueue?=?new?LinkedBlockingQueue();

BlockingQueue?workQueue?=?new?ArrayBlockingQueue(5);

ThreadFactory?threadFactory?=?Executors.defaultThreadFactory();

//線程池和隊(duì)列滿了之后的處理方式

//1.跑出異常

RejectedExecutionHandler?handler?=?new?ThreadPoolExecutor.AbortPolicy();

RejectedExecutionHandler?handler2?=?new?ThreadPoolExecutor.CallerRunsPolicy();

RejectedExecutionHandler?handler3?=?new?ThreadPoolExecutor.DiscardPolicy();

RejectedExecutionHandler?handler4?=?new?ThreadPoolExecutor.DiscardOldestPolicy();

ThreadPoolExecutor?threadPoolExecutor?=?new?ThreadPoolExecutor(corePoolSize,?maximumPoolSize,?keepAliveTime,?TimeUnit.SECONDS,?workQueue,?threadFactory,?handler2);

for?(int?j?=?1;?j?

threadPoolExecutor.execute(new?Runnable()?{

public?void?run()?{

try?{

System.out.println(Thread.currentThread().getName());

TimeUnit.SECONDS.sleep(1);

}?catch?(InterruptedException?e)?{

e.printStackTrace();

}

}

});

}

System.out.println(threadPoolExecutor);

}

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java excutorthread_Java中ThreadPoolExecutor的参数理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。