原文网址:Java线程池系列--饱和策略(拒绝策略)的使用(有实例)_IT利刃出鞘的博客-CSDN博客

简介

本文用示例介绍Java线程池的饱和策略(拒绝策略)。

概述

Java线程池的饱和策略如下:

饱和策略

说明

ThreadPoolExecutor.AbortPolicy

线程池默认的阻塞策略。

不执行此任务,而且抛出一个运行时异常(未检查的异常RejectedExecutionException)。

切记:ThreadPoolExecutor.execute需要try catch,否则程序会直接退出。

ThreadPoolExecutor.DiscardPolicy

不执行此任务,而且不抛异常。(是个空方法)

ThreadPoolExecutor.DiscardOldestPolicy

从队列里删除最老的任务(头部的一个任务),并再次execute 此task。

ThreadPoolExecutor.CallerRunsPolicy

让调用execute方法的线程执行此command,会阻塞入口。

这是个调节机制,既不抛弃任务也不抛出异常,而是将某些任务回退到调用者,让调用者所在的线程去执行。

用户自定义拒绝策略(最常用)

实现RejectedExecutionHandler,并自己定义策略模式

实例

package concurrency.pool;import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** Created by li on 2016/7/2.*/
public class SaturationPolicy {/*** 线程池工作队列已满时,在不同饱和策略下表现* @param handler 线程池工作队列饱和策略*/public static void policy(RejectedExecutionHandler handler){//基本线程2个,最大线程数为3,工作队列容量为5ThreadPoolExecutor exec = new ThreadPoolExecutor(2,3,0, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(5));if (handler != null){exec.setRejectedExecutionHandler(handler);//设置饱和策略}for (int i = 0; i < 10; i++) {exec.submit(new Task());//提交任务}exec.shutdown();}//自定义任务static class Task implements Runnable {private static int count = 0;private int id = 0;//任务标识public Task() {id = ++count;}@Overridepublic  void run() {try {TimeUnit.SECONDS.sleep(3);//休眠3秒} catch (InterruptedException e) {System.err.println("线程被中断" + e.getMessage());}System.out.println(" 任务:" + id + "\t 工作线程: "+ Thread.currentThread().getName() + " 执行完毕");}}public static void main(String[] args) {
//        policy(new ThreadPoolExecutor.AbortPolicy());
//        policy((new ThreadPoolExecutor.CallerRunsPolicy()));
//        policy(new ThreadPoolExecutor.DiscardPolicy());
//        policy(new ThreadPoolExecutor.DiscardOldestPolicy());}
}

1. Abort策略:默认策略

新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。

在主函数中添加如下代码:

policy(new ThreadPoolExecutor.AbortPolicy());

运行结果:

程序抛出了RejectedExecutionException,并且一共运行了8个任务(线程池开始能运行3个任务,工作队列中存储5个队列)。当工作队列满了的时候,直接抛出了异常,而且JVM一直不退出(我现在也不知道什么原因)。我们可以看到执行任务的线程全是线程池中的线程。

2. Discard策略:抛弃新提交的任务

在main函数中运行

policy(new ThreadPoolExecutor.DiscardPolicy());

运行结果:

通过上面的结果可以显示:没有异常抛出,后面提交的2个新任务被抛弃,只处理了前8(3+5)个任务,JVM退出。

3. DiscardOldest策略

丢弃最老(队头)的任务,然后尝试提交新的任务。(不适合工作队列为优先队列场景)

在main函数中运行如下方法

policy(new ThreadPoolExecutor.DiscardOldestPolicy());

运行结果:一共运行8个任务,程序结束,后面添加的任务9,任务10被执行了,而前面的任务3,任务4被丢弃。

4. CallerRuns策略

在主函数运行:

 policy((new ThreadPoolExecutor.CallerRunsPolicy()));

运行结果

所有的任务都被运行,且有2(10 - 3 -5)个任务是在main线程中执行成功的,8个任务在线程池中的线程执行的。

Java线程池系列--饱和策略(拒绝策略)的使用(有实例)相关推荐

  1. 《Java线程池》:任务拒绝策略

    <Java线程池>:任务拒绝策略 转载:https://blog.csdn.net/u010412719/article/details/52132613 在没有分析线程池原理之前先来分析 ...

  2. Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析

    前言 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 api,大大的简化了多线程代码的开发. ...

  3. 线程池的四种拒绝策略

    一.前言 线程池,相信很多人都有用过,没用过相信的也有学习过.但是,线程池的拒绝策略,相信知道的人会少许多. 二.四种线程池拒绝策略 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximum ...

  4. Java线程池系列--线程池的种类(Executors的用法)

    原文网址:Java线程池系列--线程池的种类(Executors的用法)_IT利刃出鞘的博客-CSDN博客 简介 说明 线程池是Java多线程常用的技术,本文介绍线程池的种类,用示例介绍其用法. 相关 ...

  5. Java多线程学习七:线程池的 4 种拒绝策略和 6 种常见的线程池

    以便在必要的时候按照我们的策略来拒绝任务,那么拒绝任务的时机是什么呢?线程池会在以下两种情况下会拒绝新提交的任务. 第一种情况是当我们调用 shutdown 等方法关闭线程池后,即便此时可能线程池内部 ...

  6. 线程池的 RejectedExecutionHandler(拒绝策略)

    转载自  https://blog.csdn.net/jgteng/article/details/54411423 https://blog.csdn.net/luofenghan/article/ ...

  7. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  8. 面试官问:你做过什么Java线程池实践,我写了一篇博客给他看~

    线程池大家都## 标题很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装, 都会牵涉到这几个核心参数的设置:核心线程数,等待(任 ...

  9. java定长池,java线程池源码学习

    使用Executors创建线程池 Executor是一个工厂类,可以直接创建线程池,从最简单的定长线程池开始学习 public static ExecutorService newFixedThrea ...

最新文章

  1. 教程 | 一文读懂自学机器学习的误区和陷阱(附学习资料)
  2. pytorch dropout用法
  3. 蓝桥杯_算法训练_最小乘积(基本型)
  4. jQuery实现购物车多物品数量的加减+总价计算
  5. 返回值由hresult变为void型_java高级之泛型
  6. 关于treeview中的checkbox的全选问题
  7. vue前期项目搭建所需要安装的插件,idea操作
  8. linux查看tongweb端口,东方通tongweb linux安装
  9. embedding lookup函数
  10. SpringBoot+Vue批量下载图片压缩包
  11. UVA 1359 POJ 3522 Slim Span(最小生成树kruskal)
  12. OpenWRT-Wifidog之利用Luci认证
  13. 模拟人脑:迄今最大规模4个实验,人工智能的救赎之路?(附PDF公号发“模拟人脑”下载)
  14. vba 发送邮件 html,VBA自动发送邮件+内容+附件
  15. Tampermonkey扩展下载
  16. 交通信号灯课程设计(红绿灯)
  17. c#语言编程:定义person类,再派生学生类如何存放学生的成绩,C#定义全班学生成绩类,包括姓名,学号,C++成绩,英语成绩,数学成绩,平均成绩...
  18. 计算机 发声原理,耳机 篇十五:动铁耳机发声原理哦。喜欢记得收藏。
  19. linux输入多行内容至文件
  20. DLL文件应该放在哪里?

热门文章

  1. Java POI 实现填充Wrod模板表格内容
  2. 英文科技文献专家审稿常见意见
  3. stray \343 in program
  4. php $a $b = $c 这种语法我想打死你!
  5. FPGA 20个例程篇:18.SD卡存放音频WAV播放(上)
  6. toe网卡 linux c,TOE(TCP offload Engine)在高频交易中的应用
  7. confirm perspective switch
  8. Kevin Durant成长之路
  9. python-turtle
  10. 如何从0开始开发一个实时联机游戏