加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

JDK并发之:线程池三(拒绝策略)

(2016-04-13 15:01:18)
分类: java
ThreadPoolExecutor的构造函数中指定了拒绝策略,及当任务数量超过了系统实际承载能力时该如何处理。
JDK内置了四种拒绝策略:
1、AbortPolicy策略
该策略直接抛出异常,阻止系统工作
2、CallerRunsPolicy策略
只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务。显然这样不会真的丢弃任务,但是,调用者线程性能可能急剧下降。
3、DiscardOledestPolicy策略
丢弃最老的一个请求任务,也就是丢弃一个即将被执行的任务,并尝试再次提交当前任务。
4、DiscardPolicy策略
默默的丢弃无法处理的任务,不予任何处理。
扩展RejectedExecutioHandler接口,自定义拒绝策略
先看下RejectedExecutionHandler接口吧:
public interfaceRejectedExecutionHandler{

    voidrejectedExecution(Runnable r,ThreadPoolExecutor executor);

}

再举个例子吧:

public classTestRejectHandler {

    class MyTask implements Runnable{

       @Override

       public void run() {

           System.out.println("Thread ID"+Thread.currentThread().getId());

           try{

              Thread.sleep(1000);

           }catch(InterruptedException e){

              e.printStackTrace();

           }

       }

    }

    public void test(){

       ThreadPoolExecutor executor= newThreadPoolExecutor(5, 5,

              0L, TimeUnit.MILLISECONDS,

              newLinkedBlockingQueue(10),

              Executors.defaultThreadFactory(),

              newRejectedExecutionHandler() {  

                  @Override

                  public voidrejectedExecution(Runnable r, ThreadPoolExecutor executor) {

                     System.out.println(r.toString()+" 被抛弃了");

                  }

              });

       MyTask task= newMyTask();

       for(int i=0;i<20;i++){

           executor.submit(task);

       }

       executor.shutdown();

    }

 

}

运行结果:

http://s15/mw690/0024DMqMgy70SxML6eG8e&690

运行test()方法,可以看到有5个任务被拒绝执行,且采用了自定义的拒绝策略。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有