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

  • 相关阅读:
    Abp Hangfire 占用 PostgreSql 连接数的另类解决方案
    Git 仓库中文件大小写重命名实践(Windows 环境)
    C# WinForm 文件夹选择控件 folderBrowserDialog 的应用实例
    使用 C# 修改文件创建时间(图片也可修改)
    ABP 在 EntityFramework 中使用扩展批量更新时的异常
    Visual Studio之“生成事件”实践
    博客专家纪念
    深入浅出-应用服务
    如何管理 .NET Core 工具
    深入浅出-可定制仓储设计
  • 原文地址:https://www.cnblogs.com/studyLog-share/p/15150872.html
Copyright © 2011-2022 走看看