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

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

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

一、簡介

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

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

Java提供了四種常見的拒絕策略:

  • AbortPolicy(拋出異常):默認的拒絕策略。當任務(wù)無法被提交給線程池時,會直接拋出RejectedExecutionException異常。

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

  • DiscardPolicy(直接丟棄):當任務(wù)無法被提交給線程池時,直接丟棄該任務(wù),沒有任何提示或處理。

  • DiscardOldestPolicy(丟棄最舊任務(wù)):當任務(wù)無法被提交給線程池時,會丟棄隊列中最早的一個任務(wù),然后嘗試再次提交當前任務(wù)。

二、AbortPolicy拒絕策略

A. 概述

AbortPolicy是ThreadPoolExecutor的默認拒絕策略,當任務(wù)無法被提交給線程池時,會直接拋出RejectedExecutionException異常。

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

實現(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)用場景

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

D. 使用示例

當線程池的任務(wù)隊列和線程隊列都已滿的情況下執(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是一種簡單的拒絕策略,當任務(wù)無法被提交給線程池時,會由提交任務(wù)的線程自己執(zhí)行該任務(wù)。

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

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

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

C. 應(yīng)用場景

適用于對任務(wù)提交失敗要求較低的場景,通過調(diào)用線程來執(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是一種簡單的拒絕策略,當任務(wù)無法被提交給線程池時,會直接丟棄該任務(wù),沒有任何提示或處理。

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

實現(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)用場景

適用于對任務(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.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是一種拒絕策略,當任務(wù)無法被提交給線程池時,會丟棄最早的一個任務(wù),然后嘗試再次提交。

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

實現(xiàn)RejectedExecutionHandler接口,在rejectedExecution方法中從隊列中獲取最早的任務(wù)并丟棄,再次提交當前任務(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)用場景

適用于對新任務(wù)優(yōu)先級比較高的場景,可以丟棄舊的任務(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<>(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é)

各種拒絕策略的特點和適用場景

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    一文看懂Mybatis中的延遲加載

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

    java正則表達式獲取url的host示例

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

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

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

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

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

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

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

最新評論

乌什县| 富民县| 千阳县| 苗栗市| 江源县| 呼和浩特市| 石阡县| 呈贡县| 石狮市| 长子县| 西丰县| 屏东县| 句容市| 上思县| 南投市| 元阳县| 玉门市| 中超| 建湖县| 青川县| 庆城县| 新沂市| 金昌市| 甘南县| 新竹市| 焉耆| 囊谦县| 柏乡县| 奉化市| 红原县| 德安县| 休宁县| 汝城县| 修文县| 昌平区| 当阳市| 图片| 红安县| 五台县| 郯城县| 巍山|