zoukankan      html  css  js  c++  java
  • java并发:线程池之饱和策略

    一、饱和策略(线程池任务拒绝策略)

    ThreadPoolExecutor构造函数的RejectedExecutionHandler handler参数表示当提交的任务数超过maxmumPoolSize与workQueue之和时,任务会交给RejectedExecutionHandler来处理,此处我们来具体了解一下

    二、源码分析

    (1)ThreadPoolExecutor中默认的饱和策略定义如下:

        /**
         * The default rejected execution handler.
         */
        private static final RejectedExecutionHandler defaultHandler =
            new AbortPolicy();

    (2)ThreadPoolExecutor中获取、设置饱和策略的方法如下:

        /**
         * Sets a new handler for unexecutable tasks.
         *
         * @param handler the new handler
         * @throws NullPointerException if handler is null
         * @see #getRejectedExecutionHandler
         */
        public void setRejectedExecutionHandler(RejectedExecutionHandler handler) {
            if (handler == null)
                throw new NullPointerException();
            this.handler = handler;
        }
    
        /**
         * Returns the current handler for unexecutable tasks.
         *
         * @return the current handler
         * @see #setRejectedExecutionHandler(RejectedExecutionHandler)
         */
        public RejectedExecutionHandler getRejectedExecutionHandler() {
            return handler;
        }

    (3)RejectedExecutionHandler接口

    RejectedExecutionHandler的定义如下:

    public interface RejectedExecutionHandler{
        //被线程池丢弃的线程处理机制
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) ;
    }

    (4)AbortPolicy

    此策略继承RejectedExecutionHandler接口,其源码如下:

    public static class AbortPolicy implements RejectedExecutionHandler{
    
        public AbortPolicy(){}
        
        //直接抛出异常
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            throw new RejectedExecutionException("Task"+r.toString()+"rejected from"+executor.toString());
        }
        
    }

    (5)自定义饱和策略

    实现RejectedExecutionHandler接口,代码如下:

    package com.test;
    
    import java.util.concurrent.RejectedExecutionHandler;
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class RejectedExecutionHandlerDemo implements RejectedExecutionHandler{
    
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            // TODO Auto-generated method stub
            System.out.println("线程信息"+r.toString()+"被遗弃的线程池:"+executor.toString());
        }
        
    }

    Note:

    针对线程池使用 FutureTask 时,如果饱和策略设置为 DiscardPolicy 和 DiscardOldestPolicy,并且在被拒绝的任务的 Future对象上调用了无参 get方法,那么调用线程会一直被阻塞。

  • 相关阅读:
    SQLServer2008 行转列2
    SQLServer2008 行转列
    关于删除数据仓库的数据
    PowerDesign不让name和code联动
    提高SQL查询效率(SQL优化)(转载)
    SQL优化----百万数据查询优化(转载)
    运行程序向一个Java类中动态添加注解。
    开阔自己的视野,勇敢的接触新知识(转)
    [置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)
    一个谷歌程序员的算法学习之路
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/15150872.html
Copyright © 2011-2022 走看看