博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程池拒绝策略
阅读量:7141 次
发布时间:2019-06-28

本文共 3454 字,大约阅读时间需要 11 分钟。

线程池拒绝策略的类图:大致有七种左右

Java线程池拒绝策略

具体看下每个类的源码:

AbortPolicy(直接抛异常)

public static class AbortPolicy implements RejectedExecutionHandler {        public AbortPolicy() { }        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            throw new RejectedExecutionException("Task " + r.toString" rejected from " + e.toString());        }    }

AbortPolicyWithReport(记录日志)

public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {    static private final Logger logger = LoggerInit.LOGGER;     private final String threadName;    private final URL url;    public AbortPolicyWithReport(String threadName, URL url) {        this.threadName = threadName;        this.url = url;    }    @Override    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {        String msg = String.format("Thread pool is EXHAUSTED!" +                " Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: %d)," +                " Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!" ,                threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(), e.getLargestPoolSize(),                e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),                url.getProtocol(), url.getIp(), url.getPort());        logger.warn(msg);        throw new RejectedExecutionException(msg);    }}

CallerRunsPolicy(调用者执行)

public static class CallerRunsPolicy implements RejectedExecutionHandler {        public CallerRunsPolicy() { }        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            if (!e.isShutdown()) {                r.run();            }        }    }

DiscardOldestPolicy(抛弃线程池中最旧的未处理的任务)

public static class DiscardOldestPolicy implements RejectedExecutionHandler {        public DiscardOldestPolicy() { }        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            if (!e.isShutdown()) {                e.getQueue().poll();                e.execute(r);            }        }    }

DiscardPolicy(直接拒绝,不作处理)

public static class DiscardPolicy implements RejectedExecutionHandler {        public DiscardPolicy() { }        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {        }    }

IgnoreRunsPolicy(忽略运行测试,dump jvm信息)

private static class IgnoreRunsPolicy implements RejectedExecutionHandler {        private final static Logger LOGGER = LoggerInit.LOGGER;        public volatile boolean hasDump = false;        public IgnoreRunsPolicy() {        }        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            dumpJVMInfo();   //方法太长不予展示,就是这个dump jvm信息的意思            // ignore it when thread full and it will be timeout response for client            throw new RejectedExecutionException();        }

NewThreadRunsPolicy(在MemoryAwareThreadPoolExecutor里面新建一个临时线程去处理)

private static final class NewThreadRunsPolicy implements RejectedExecutionHandler {        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {            try {                final Thread t = new Thread(r, "Temporary task executor");                t.start();            } catch (Throwable e) {                throw new RejectedExecutionException(                        "Failed to start a new thread", e);            }        }    }

看完源码是不是对线程池拒绝策略有了更深的认识了?

转载于:https://blog.51cto.com/thinklili/2115661

你可能感兴趣的文章
恶意软件盯上了加密货币,两家以色列公司受到攻击
查看>>
专访《Haskell函数式编程入门》作者张淞:浅谈Haskell的优点与启发
查看>>
VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
查看>>
Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
查看>>
如何自动搞定全站图片的alt属性?
查看>>
配置一次,到处运行:将配置与运行时解耦
查看>>
突发热点事件下微博高可用注册中心vintage的设计\u0026实践
查看>>
Elixir 1.3带来新的语言功能、API和改进后的工具
查看>>
用Elm语言降低失败的风险
查看>>
抓住热门话题一对一直播,如何在风浪四起的直播市场劈风斩浪? ...
查看>>
手把手教你用owncloud搭建属于自己的云盘
查看>>
epoll+socket实现 socket并发 linux服务器
查看>>
阿里巴巴人事再调整,将打通淘宝、天猫两个消费场景 ...
查看>>
Kubernetes + CRI + Kata + Firecracker
查看>>
菜鸟成都未来园区启动,无人车首次进入园区调拨运输环节 ...
查看>>
算法不扎实的程序员,每个都很慌
查看>>
4个需要避免的常见Kubernetes监控陷阱
查看>>
规划一个智能工厂应避免的十个坑
查看>>
Linux 虚拟网络设备详解之 Bridge 网桥
查看>>
LaTeX的简单使用方法
查看>>