• 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方法,那么调用线程会一直被阻塞。

  • 相关阅读:
    NodeJ node.js Jquery Ajax 跨域请求
    NodeJ node.js基础
    VueX--- actions→mutations or getters→state 四大金刚
    Vue--- VueX组件间通信链接(共有方法放入了扩展目录store里面) 1.2
    arrayList 和hashSet的区别
    java面试的题目兔子、素数、水仙花
    解决java compiler level does not match the version of the installed java project facet
    Target runtime com.genuitec.runtime.generic.jee50 is not defined工程错误
    eclipse导入tomcat时Unknown version of Tomcat was specified
    eclipse开发SVN下文件显示修改时间和提交作者的方法
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/15150872.html
Copyright © 2020-2023  润新知