亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Java中有界隊(duì)列的飽和策略(reject policy)原理解析

瀏覽:85日期:2022-09-02 13:19:18

我們?cè)谑褂肊xecutorService的時(shí)候知道,在ExecutorService中有個(gè)一個(gè)Queue來保存提交的任務(wù),通過不同的構(gòu)造函數(shù),我們可以創(chuàng)建無界的隊(duì)列(ExecutorService.newCachedThreadPool)和有界的隊(duì)列(ExecutorService newFixedThreadPool(int nThreads))。

無界隊(duì)列很好理解,我們可以無限制的向ExecutorService提交任務(wù)。那么對(duì)于有界隊(duì)列來說,如果隊(duì)列滿了該怎么處理呢?

今天我們要介紹一下java中ExecutorService的飽和策略(reject policy)。

以ExecutorService的具體實(shí)現(xiàn)ThreadPoolExecutor來說,它定義了4種飽和策略。分別是AbortPolicy,DiscardPolicy,DiscardOldestPolicy和CallerRunsPolicy。

如果要在ThreadPoolExecutor中設(shè)定飽和策略可以調(diào)用setRejectedExecutionHandler方法,如下所示:

ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(20)); threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy() );

上面的例子中我們定義了一個(gè)初始5個(gè),最大10個(gè)工作線程的Thread Pool,并且定義其中的Queue的容量是20。如果提交的任務(wù)超出了容量,則會(huì)使用AbortPolicy策略。

AbortPolicy

AbortPolicy意思是如果隊(duì)列滿了,最新的提交任務(wù)將會(huì)被拒絕,并拋出RejectedExecutionException異常:

public static class AbortPolicy implements RejectedExecutionHandler { /** * Creates an {@code AbortPolicy}. */ public AbortPolicy() { } /** * Always throws RejectedExecutionException. * * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task * @throws RejectedExecutionException always */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException('Task ' + r.toString() + ' rejected from ' + e.toString()); } }

上面的代碼中,rejectedExecution方法中我們直接拋出了RejectedExecutionException異常。

DiscardPolicy

DiscardPolicy將會(huì)悄悄的丟棄提交的任務(wù),而不報(bào)任何異常。

public static class DiscardPolicy implements RejectedExecutionHandler { /** * Creates a {@code DiscardPolicy}. */ public DiscardPolicy() { } /** * Does nothing, which has the effect of discarding task r. * * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }

DiscardOldestPolicy

DiscardOldestPolicy將會(huì)丟棄最老的任務(wù),保存最新插入的任務(wù)。

public static class DiscardOldestPolicy implements RejectedExecutionHandler { /** * Creates a {@code DiscardOldestPolicy} for the given executor. */ public DiscardOldestPolicy() { } /** * Obtains and ignores the next task that the executor * would otherwise execute, if one is immediately available, * and then retries execution of task r, unless the executor * is shut down, in which case task r is instead discarded. * * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) {e.getQueue().poll();e.execute(r); } } }

我們看到在rejectedExecution方法中,poll了最老的一個(gè)任務(wù),然后使用ThreadPoolExecutor提交了一個(gè)最新的任務(wù)。

CallerRunsPolicy

CallerRunsPolicy和其他的幾個(gè)策略不同,它既不會(huì)拋棄任務(wù),也不會(huì)拋出異常,而是將任務(wù)回退給調(diào)用者,使用調(diào)用者的線程來執(zhí)行任務(wù),從而降低調(diào)用者的調(diào)用速度。我們看下是怎么實(shí)現(xiàn)的:

public static class CallerRunsPolicy implements RejectedExecutionHandler { /** * Creates a {@code CallerRunsPolicy}. */ public CallerRunsPolicy() { } /** * Executes task r in the caller’s thread, unless the executor * has been shut down, in which case the task is discarded. * * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) {r.run(); } } }

在rejectedExecution方法中,直接調(diào)用了 r.run()方法,這會(huì)導(dǎo)致該方法直接在調(diào)用者的主線程中執(zhí)行,而不是在線程池中執(zhí)行。從而導(dǎo)致主線程在該任務(wù)執(zhí)行結(jié)束之前不能提交任何任務(wù)。從而有效的阻止了任務(wù)的提交。

使用Semaphore

如果我們并沒有定義飽和策略,那么有沒有什么方法來控制任務(wù)的提交速度呢?考慮下之前我們講到的Semaphore,我們可以指定一定的資源信號(hào)量來控制任務(wù)的提交,如下所示:

public class SemaphoreUsage { private final Executor executor; private final Semaphore semaphore; public SemaphoreUsage(Executor executor, int count) { this.executor = executor; this.semaphore = new Semaphore(count); } public void submitTask(final Runnable command) throws InterruptedException { semaphore.acquire(); try { executor.execute(() -> { try { command.run(); } finally { semaphore.release(); } } ); } catch (RejectedExecutionException e) { semaphore.release(); } }}

本文的例子可參考https://github.com/ddean2009/learn-java-concurrency/tree/master/rejectPolicy

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲不卡 | 中文字幕在线播放一区 | 欧美午夜艳片欧美精品 | 韩国毛片免费看 | 999久久免费高清热精品 | 日韩城人视频 | 免费国产成人高清在线观看视频 | 亚洲欧洲日韩国产 | 国产欧美亚洲精品第3页在线 | 在线观看 日韩 | 黄在线视频播放免费网站 | 小明永久2015www永久免费观看 | 亚洲精品久一区 | 日本免费黄色小视频 | 国产毛片一区二区三区 | 高清一级做a爱过程免费视频 | 免费三片在线观看网站 | 91刘亦菲精品福利在线 | 欧美综合色区 | 欧美黄色大片网站 | 国产三级在线观看播放 | 拍拍在线观看免费播放 | 精品视频h| jk足控福利国产在线播放 | 久久久久久免费一区二区三区 | 中国国产一级毛片 | 亚洲福利院| 99pao成人国产永久免费视频 | 色拍拍在线精品视频 | 国产全黄a一级毛片视频 | 免费观看一级欧美大 | 1024你懂的国产 | 99re这里有免费视频精品 | 国产精品亚洲欧美一级久久精品 | 产国语一级特黄aa大片 | 激情影院成人区免费观看视频 | 精品美女在线 | 国产成人综合在线观看网站 | 在线免费观看小视频 | 免费黄色片大全 | 99久久国产免费福利 |