欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程4種拒絕策略小結

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

一、簡介

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

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

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

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

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

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

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

二、AbortPolicy拒絕策略

A. 概述

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

B. 拒絕策略實現原理

實現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. 應用場景

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

D. 使用示例

當線程池的任務隊列和線程隊列都已滿的情況下執(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 {
            // 提交任務
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關閉線程池
            threadPool.shutdown();
        }
    }
}

三、CallerRunsPolicy拒絕策略

A. 概述

CallerRunsPolicy是一種簡單的拒絕策略,當任務無法被提交給線程池時,會由提交任務的線程自己執(zhí)行該任務。

B. 拒絕策略實現原理

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

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

C. 應用場景

適用于對任務提交失敗要求較低的場景,通過調用線程來執(zhí)行任務,避免任務丟失。

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 {
            // 提交任務
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

四、DiscardPolicy拒絕策略

A. 概述

DiscardPolicy是一種簡單的拒絕策略,當任務無法被提交給線程池時,會直接丟棄該任務,沒有任何提示或處理。

B. 拒絕策略實現原理

實現RejectedExecutionHandler接口,在rejectedExecution方法中不做任何操作,即丟棄任務。

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

C. 應用場景

適用于對任務提交失敗不敏感的場景,對任務丟失沒有特殊要求。

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 {
            // 提交任務
            threadPool.execute(new Task(1));
            threadPool.execute(new Task(2));
            threadPool.execute(new Task(3));
        } catch (RejectedExecutionException e) {
            e.printStackTrace();
        } finally {
            // 關閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

五、DiscardOldestPolicy拒絕策略

A. 概述

DiscardOldestPolicy是一種拒絕策略,當任務無法被提交給線程池時,會丟棄最早的一個任務,然后嘗試再次提交。

B. 拒絕策略實現原理

實現RejectedExecutionHandler接口,在rejectedExecution方法中從隊列中獲取最早的任務并丟棄,再次提交當前任務。

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

C. 應用場景

適用于對新任務優(yōu)先級比較高的場景,可以丟棄舊的任務以保證及時處理新任務。

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 {
            // 提交任務
            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 {
            // 關閉線程池
            threadPool.shutdown();
        }
    }
}

在這里插入圖片描述

六、總結

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

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

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

相關文章

  • Java面試題沖刺第十七天--基礎篇3

    Java面試題沖刺第十七天--基礎篇3

    這篇文章主要為大家分享了最有價值的三道java基礎面試題,涵蓋內容全面,包括數據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Spring菜鳥教你看源碼沖面試

    Spring菜鳥教你看源碼沖面試

    這篇文章主要介紹了Spring菜鳥教你看源碼沖面試,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java8生成時間方式及格式化時間的方法實例

    Java8生成時間方式及格式化時間的方法實例

    這篇文章主要給大家介紹了關于Java8生成時間方式及格式化時間的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • java實現的xml格式化實現代碼

    java實現的xml格式化實現代碼

    這篇文章主要介紹了java實現的xml格式化實現代碼,需要的朋友可以參考下
    2016-11-11
  • Java SpringBoot啟動指定profile的8種方式詳解

    Java SpringBoot啟動指定profile的8種方式詳解

    這篇文章主要介紹了spring boot 如何指定profile啟動的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Aop之AspectJ注解配置實現日志管理的方法

    Spring Aop之AspectJ注解配置實現日志管理的方法

    下面小編就為大家分享一篇Spring Aop之AspectJ注解配置實現日志管理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Springboot 整合 Java DL4J 打造文本摘要生成系統

    Springboot 整合 Java DL4J 打造文本摘要生成系統

    本文介紹了如何使用SpringBoot整合JavaDeeplearning4j構建文本摘要生成系統,該系統能夠自動從長篇文本中提取關鍵信息,生成簡潔的摘要,幫助用戶快速了解文本的主要內容,技術實現包括使用LSTM神經網絡進行模型構建和訓練,并通過SpringBoot集成RESTfulAPI接口
    2024-11-11
  • java Callable接口和Future接口創(chuàng)建線程示例詳解

    java Callable接口和Future接口創(chuàng)建線程示例詳解

    這篇文章主要為大家介紹了java Callable接口和Future接口創(chuàng)建線程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • java枚舉類型-Enum

    java枚舉類型-Enum

    本文詳細介紹了 Java1.5 引入的新特性枚舉中的關鍵字enum,運用大量的代碼加以解釋,相信可以幫助到正在學習該知識的小伙伴,大家可以參考一下
    2021-08-08
  • java實現計算器模板及源碼

    java實現計算器模板及源碼

    這篇文章主要為大家詳細介紹了java實現計算器模板及源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論