java并发编程实践阅读笔记之线程池的饱和策略

使用java的任务管理框架的线程池执行任务时,线程池的任务等待队列被填满时,饱和策略开始发挥作用。ThreadPollExecutor的饱和策略通过setRejectedExecutionHandler来修改。JDK提供了4中饱和策略如下:

AbortPolicy是默认的饱和策略,该策略会抛出未检查异常RejectedExecutionException,调用者可以捕获这个异常,然后根据自己的需求编写代码。CallerRunsPolicy则提供了一种调节机制,该策略不会抛弃任务,也不会抛出异常,而是将任务的运行回退到任务调用者,在提交任务的线程中执行该任务。下列例子中模拟了调用者运行策略,线程池初始化大小为2,等待队列大小为2,当提交任务大于4个时,第5个任务就会在任务提交的主线程中运行。

public class MyCommand implements Runnable {

private String name;

public MyCommand(String name){

this.name = name;

}

@Override

public void run() {

System.out.println(Thread.currentThread().getName()+" ," +

"name: "+name+","+new Date());

try {

Thread.sleep(5000);

} catch (InterruptedException execption) {

execption.printStackTrace();

}

}

}

使用调用者运行策略执行任务:

public class CallerRunTest {

private final ThreadPoolExecutor exec ;

public CallerRunTest(){

exec = new ThreadPoolExecutor(2,2,0L,TimeUnit.MICROSECONDS,

new LinkedBlockingQueue(2));

exec.setRejectedExecutionHandler(

new ThreadPoolExecutor.CallerRunsPolicy());

}

public static void main(String[] args) {

MyCommand c1 = new MyCommand("c1");

MyCommand c2 = new MyCommand("c2");

MyCommand c3 = new MyCommand("c3");

MyCommand c4 = new MyCommand("c4");

MyCommand c5 = new MyCommand("c5");

CallerRunTest c = new CallerRunTest();

c.submit(c1);

c.submit(c2);

c.submit(c3);

c.submit(c4);

c.submit(c5);

}

public void submit(Runnable command){

System.out.println(Thread.currentThread().getName()+" submit tast...");

exec.submit(command);

}

}

提交的任务打印一句任务名称,然后休眠5秒,线程池大小为2,等待队列大小为2 ,当第5个任务提交时,它会在主线程中执行,其他任务则都是由线程池调度运行。运行结果如下:

main submit tast...

main submit tast...

main submit tast...

main submit tast...

main submit tast...

pool-1-thread-1 ,name: c1,Mon Dec 15 15:55:02 CST 2014

main ,name: c5,Mon Dec 15 15:55:02 CST 2014

pool-1-thread-2 ,name: c2,Mon Dec 15 15:55:02 CST 2014

pool-1-thread-1 ,name: c4,Mon Dec 15 15:55:07 CST 2014

pool-1-thread-2 ,name: c3,Mon Dec 15 15:55:07 CST 2014

结论:调用者运行的饱和策略实现了一种调节机制,当工作队列被填满时,下一个待执行的任务会在任务提交主线程中执行,由于任务执行需要一定得时间,在任务运行期间主线程将不能再提交任务,以此可以降低任务的提交速率,为线程池正确更多的时间来完成正在排队的任务。

java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园相关推荐

  1. java约瑟夫环链式结构_顺序表实现解约瑟夫环_Java | 学步园

    今天我们来使用顺序表类求解约瑟夫(Josephus)环问题. 首先我闲来描述下约瑟夫环问题:古代某法官要裁决n个犯人的死刑,他有一条荒唐的法律,将犯人站成一个圆圈,从第s个人开始数起,每数到第d个犯人 ...

  2. java中的锁池和等待池是什么_线程的几个状态及方法,等待池和锁池的理解

    线程状态: 创建状态:创建一个线程实例 Thread thread = new Thread(); 就绪状态:在调用start()方法后,线程获取了除CPU的其他资源,处于就绪状态 执行状态:线程获取 ...

  3. future 线程报错后_线程池运用实例——一次错误的多线程程序设计以及修复过程...

    写在前面的话 写下这篇文章只为了回顾之前在实际工作中犯的一个极其二逼的错误,用我的经历来提示后来者,诸位程序大神,大牛,小牛们看到此文笑笑即可,轻拍轻拍... 1 背景 有这么一个需求,我们的系统(后 ...

  4. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  5. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  6. 反积分饱和 程序_用抗积分饱和PID控制传递函数为G(s)的被控对象

    题目:用抗积分饱和PID控制传递函数为G(s)的被控对象 G(s)=523500/(s^3+87.35s^2+10470s) 二.抗积分饱和原理 积分饱和现象是在系统存在一个方向的偏差,PID控制器的 ...

  7. pc如何打开组策略_如何查看哪些组策略应用于您的PC和用户帐户

    pc如何打开组策略 We have shown you a lot of tips and tricks over the years that involve modifying Local Gro ...

  8. JAVA线程并发数量控制_线程同步工具(二)控制并发访问多个资源

    声明:本文是< Java 7 Concurrency Cookbook>的第三章, 作者: Javier Fernández González 译者:郑玉婷 控制并发访问多个资源 在并发访 ...

  9. java线程暂停和继续_线程暂停和恢复

    一个线程,在无限的循环,当有数据的时候就会被处理掉,但是如果暂时还没有数据,我们也会迭代判断有没有数据.这样就造成了浪费.我们可以让没有数据的时候暂停这个线程,当有数据进来的时候再通知线程运行,如果线 ...

最新文章

  1. IIS7.0 网站发布页面显示 500 - 内部服务器错误。您要查找的资源有问题,无法显示...
  2. element-ui中单独引入Message组件的问题
  3. 收起 展开 循环 php,CSS3 实现侧边栏展开收起动画
  4. Makefile和shell脚本调用上的一些总结
  5. netcore 编译 html,Asp.Net Core中的@ Html.Action
  6. shiro学习(12)No WebApplicationContext found:
  7. 互联网晚报 | 3月3日 星期四 |​ 苹果将于北京时间3月9日凌晨2点举办春季发布会;vivo子品牌NEX被砍掉...
  8. Git相关命令及用法
  9. 【Linux】肝!Shell 脚本编程最佳实践
  10. 蓝桥杯 BASIC-10 十进制转十六进制
  11. 按3倍中误差去除粗差(C++)
  12. 理想费米气体的量子统计推导
  13. 人民币大写金额转换为数字
  14. 【金融财经】金融市场一周简报(2017-09-01)
  15. 助推外贸高质量发展,玉湖冷链模式引发服贸行业高度关注
  16. AlBaath Collegiate Programming Contest (2015) 总结
  17. vue导出excel加一个进度条_使用vue导出excel文件
  18. 3D 游戏之父卡马克再创业:“我自己出得起 2000 万美元,但花投资人的钱会更有责任心”...
  19. QGridLayout(表格布局)详细使用说明
  20. Python-文件夹的拷贝操作

热门文章

  1. android重启应用
  2. mysql pricing amp; licensing_Global Pricing and Licensing
  3. java 判断日期是同一天_如何检查Java中的两个日期是否在同一天
  4. 2020计算机考研初试考试先后顺序,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  5. Android SQLite数据库的详细使用
  6. idea swagger生成接口文档_spring boot集成Swagger-UI接口文档
  7. html 占位文本,跨浏览器的HTML5占位文本(PlaceHolder)方案
  8. mysql pdo 获取最后一条sql_一条SQL如何在MYSQL中执行的
  9. 盐城工学院计算机考研高吗,信息学院计算机班计玮考取中南大学研究生
  10. ip映射后 前端无法调用接口_基于S7300400 CPU集成PN接口的Modbus TCPW