最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程4種拒絕策略小結(jié)

 更新時(shí)間:2024年03月04日 09:03:43   作者:皮卡沖撞  
當(dāng)線程池中的任務(wù)隊(duì)列已滿且無(wú)法再接受新的任務(wù)時(shí),就需要采取拒絕策略來(lái)處理這種情況,本文主要介紹了Java多線程拒絕策略,包含了四種常見(jiàn)的拒絕策略,具有一定的參考價(jià)值,感興趣的可以了解一下

一、簡(jiǎn)介

在Java多線程編程中,我們通常使用線程池來(lái)管理和調(diào)度任務(wù)。線程池由一組預(yù)先創(chuàng)建的線程組成,可以重復(fù)利用這些線程來(lái)執(zhí)行多個(gè)任務(wù),避免頻繁地創(chuàng)建和銷(xiāo)毀線程而帶來(lái)的性能開(kāi)銷(xiāo)。

當(dāng)線程池中的任務(wù)隊(duì)列已滿且無(wú)法再接受新的任務(wù)時(shí),就需要采取拒絕策略來(lái)處理這種情況。拒絕策略定義了當(dāng)無(wú)法再接受新的任務(wù)時(shí)如何處理這些被拒絕的任務(wù)。

Java提供了四種常見(jiàn)的拒絕策略:

  • AbortPolicy(拋出異常):默認(rèn)的拒絕策略。當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)直接拋出RejectedExecutionException異常。

  • CallerRunsPolicy(調(diào)用者運(yùn)行):當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)由提交任務(wù)的線程自己執(zhí)行該任務(wù)。

  • DiscardPolicy(直接丟棄):當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),直接丟棄該任務(wù),沒(méi)有任何提示或處理。

  • DiscardOldestPolicy(丟棄最舊任務(wù)):當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)丟棄隊(duì)列中最早的一個(gè)任務(wù),然后嘗試再次提交當(dāng)前任務(wù)。

二、AbortPolicy拒絕策略

A. 概述

AbortPolicy是ThreadPoolExecutor的默認(rèn)拒絕策略,當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)直接拋出RejectedExecutionException異常。

B. 拒絕策略實(shí)現(xiàn)原理

實(shí)現(xiàn)RejectedExecutionHandler接口,在rejectedExecution方法中拋出異常。

public class AbortPolicy implements RejectedExecutionHandler {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString());
    }
}

C. 應(yīng)用場(chǎng)景

適用于對(duì)任務(wù)提交失敗要求敏感的場(chǎng)景,需要明確知道任務(wù)是否被接受并執(zhí)行。

D. 使用示例

當(dāng)線程池的任務(wù)隊(duì)列和線程隊(duì)列都已滿的情況下執(zhí)行決絕策略

public class Task implements Runnable {

    private final int index;

    public Task(int index) {
        this.index = index;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":" + index);
    }
}


public class Main {

    public static void main(String[] args) {
        // 創(chuàng)建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1),
                new ThreadPoolExecutor.AbortPolicy());
        try {
            // 提交任務(wù)
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關(guān)閉線程池
            threadPool.shutdown();
        }
    }
}

三、CallerRunsPolicy拒絕策略

A. 概述

CallerRunsPolicy是一種簡(jiǎn)單的拒絕策略,當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)由提交任務(wù)的線程自己執(zhí)行該任務(wù)。

B. 拒絕策略實(shí)現(xiàn)原理

實(shí)現(xiàn)RejectedExecutionHandler接口,在rejectedExecution方法中使用提交任務(wù)的線程來(lái)執(zhí)行任務(wù)。

public class CallerRunsPolicy implements RejectedExecutionHandler {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();
        }
    }
}

C. 應(yīng)用場(chǎng)景

適用于對(duì)任務(wù)提交失敗要求較低的場(chǎng)景,通過(guò)調(diào)用線程來(lái)執(zhí)行任務(wù),避免任務(wù)丟失。

D. 使用示例

public class Task implements Runnable {

    private final int index;

    public Task(int index) {
        this.index = index;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":" + index);
    }
}
public class Main {

    public static void main(String[] args) {
        // 創(chuàng)建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1),
                new ThreadPoolExecutor.CallerRunsPolicy());
        try {
            // 提交任務(wù)
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關(guān)閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

四、DiscardPolicy拒絕策略

A. 概述

DiscardPolicy是一種簡(jiǎn)單的拒絕策略,當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)直接丟棄該任務(wù),沒(méi)有任何提示或處理。

B. 拒絕策略實(shí)現(xiàn)原理

實(shí)現(xiàn)RejectedExecutionHandler接口,在rejectedExecution方法中不做任何操作,即丟棄任務(wù)。

public class DiscardPolicy implements RejectedExecutionHandler {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        // Do nothing, discard the task
    }
}

C. 應(yīng)用場(chǎng)景

適用于對(duì)任務(wù)提交失敗不敏感的場(chǎng)景,對(duì)任務(wù)丟失沒(méi)有特殊要求。

D. 使用示例

public class Task implements Runnable {

    private final int index;

    public Task(int index) {
        this.index = index;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":" + index);
    }
}
public class Main {

    public static void main(String[] args) {
        // 創(chuàng)建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1),
                new ThreadPoolExecutor.DiscardOldestPolicy());
        try {
            // 提交任務(wù)
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關(guān)閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

五、DiscardOldestPolicy拒絕策略

A. 概述

DiscardOldestPolicy是一種拒絕策略,當(dāng)任務(wù)無(wú)法被提交給線程池時(shí),會(huì)丟棄最早的一個(gè)任務(wù),然后嘗試再次提交。

B. 拒絕策略實(shí)現(xiàn)原理

實(shí)現(xiàn)RejectedExecutionHandler接口,在rejectedExecution方法中從隊(duì)列中獲取最早的任務(wù)并丟棄,再次提交當(dāng)前任務(wù)。

public class DiscardOldestPolicy implements RejectedExecutionHandler {
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll();
            e.execute(r);
        }
    }
}

C. 應(yīng)用場(chǎng)景

適用于對(duì)新任務(wù)優(yōu)先級(jí)比較高的場(chǎng)景,可以丟棄舊的任務(wù)以保證及時(shí)處理新任務(wù)。

D. 使用示例

public class Task implements Runnable {

    private final int index;

    public Task(int index) {
        this.index = index;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ":" + index);
    }
}
public class Main {

    public static void main(String[] args) {
        // 創(chuàng)建線程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 0L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(2),
                new ThreadPoolExecutor.DiscardOldestPolicy());
        try {
            // 提交任務(wù)
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
            threadPool.execute(new Task(4));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關(guān)閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

六、總結(jié)

各種拒絕策略的特點(diǎn)和適用場(chǎng)景

  • AbortPolicy:對(duì)任務(wù)提交失敗要求敏感,需要明確知道任務(wù)是否被接受并執(zhí)行。
  • CallerRunsPolicy:對(duì)任務(wù)提交失敗要求較低,通過(guò)調(diào)用線程來(lái)執(zhí)行任務(wù),避免任務(wù)丟失。
  • DiscardPolicy:對(duì)任務(wù)提交失敗不敏感,對(duì)任務(wù)丟失沒(méi)有特殊要求。
  • DiscardOldestPolicy:適用于新任務(wù)優(yōu)先級(jí)高,丟棄舊任務(wù)以保證及時(shí)處理新任務(wù)。

到此這篇關(guān)于Java多線程4種拒絕策略小姐的文章就介紹到這了,更多相關(guān)Java多線程拒絕策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java線程狀態(tài)運(yùn)行原理解析

    Java線程狀態(tài)運(yùn)行原理解析

    這篇文章主要介紹了Java線程狀態(tài)運(yùn)行原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • mybatis多個(gè)區(qū)間處理方式(雙foreach循環(huán))

    mybatis多個(gè)區(qū)間處理方式(雙foreach循環(huán))

    這篇文章主要介紹了mybatis多個(gè)區(qū)間處理方式(雙foreach循環(huán)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Hadoop環(huán)境配置之hive環(huán)境配置詳解

    Hadoop環(huán)境配置之hive環(huán)境配置詳解

    這篇文章主要介紹了Hadoop環(huán)境配置之hive環(huán)境配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 使用@value注解取不到application.xml配置文件中的值問(wèn)題

    使用@value注解取不到application.xml配置文件中的值問(wèn)題

    這篇文章主要介紹了使用@value注解取不到application.xml配置文件中的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springmvc+spring+mybatis實(shí)現(xiàn)用戶登錄功能(上)

    springmvc+spring+mybatis實(shí)現(xiàn)用戶登錄功能(上)

    這篇文章主要為大家詳細(xì)介紹了springmvc+spring+mybatis實(shí)現(xiàn)用戶登錄功能,比較基礎(chǔ)的學(xué)習(xí)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 一文看懂Mybatis中的延遲加載

    一文看懂Mybatis中的延遲加載

    這篇文章主要介紹了一文看懂Mybatis中的延遲加載,延遲加載也稱(chēng)為懶加載,是指在進(jìn)行表的關(guān)聯(lián)查詢時(shí),按照設(shè)置延遲規(guī)則推遲對(duì)關(guān)聯(lián)對(duì)象的select查詢,MyBatis 的延遲加載只是對(duì)關(guān)聯(lián)對(duì)象的查詢有遲延設(shè)置,對(duì)于主加載對(duì)象都是直接執(zhí)行查詢語(yǔ)句的,需要的朋友可以參考下
    2023-10-10
  • java正則表達(dá)式獲取url的host示例

    java正則表達(dá)式獲取url的host示例

    使用httpclient抓取頁(yè)面信息時(shí)需要填寫(xiě)HOST,使用此正則提取抓取URL的HOST內(nèi)容
    2014-02-02
  • 基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題

    基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題

    這篇文章主要介紹了基于Pinpoint對(duì)SpringCloud微服務(wù)項(xiàng)目實(shí)現(xiàn)全鏈路監(jiān)控的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過(guò)程詳解

    Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過(guò)程詳解

    本文將通過(guò)Java后端程序代碼展示如何實(shí)現(xiàn)將PPT幻燈片轉(zhuǎn)成OFD格式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-01-01
  • Java如何自定義類(lèi)數(shù)組的創(chuàng)建和初始化

    Java如何自定義類(lèi)數(shù)組的創(chuàng)建和初始化

    這篇文章主要介紹了Java如何自定義類(lèi)數(shù)組的創(chuàng)建和初始化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

乡宁县| 达孜县| 邳州市| 凤冈县| 彭阳县| 交口县| 临汾市| 祁连县| 和林格尔县| 纳雍县| 宁陕县| 烟台市| 迁西县| 邢台市| 合川市| 内黄县| 通榆县| 青川县| 天峻县| 亳州市| 永宁县| 枣强县| 岳阳县| 桃园县| 万载县| 从化市| 贡山| 通城县| 台湾省| 华安县| 旬邑县| 澎湖县| 禹城市| 九江市| 信丰县| 来凤县| 龙南县| 和林格尔县| 巫溪县| 沐川县| 汝州市|