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

  • 相关阅读:
    Jmeter 04 JMeter 负载与监听
    《Python 机器学习》笔记(四)
    《动手学深度学习(李沐)》笔记3
    《动手学深度学习(李沐)》笔记2
    《动手学深度学习(李沐)》笔记1
    Latex排版全解(转)
    《Python机器学习》笔记(三)
    《数据挖掘导论》笔记(四)
    Latex技巧:在图表序号中加入章节号(实现诸如“图1.1.2”这样的图表序号)
    Latex技巧:插入参考文献
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/15150872.html
Copyright © 2011-2022 走看看