java并发初探ThreadPoolExecutor拒绝策略

ThreadPoolExecuter构造器

corePoolSize是核心线程池,就是常驻线程池数量;

maximumPoolSize是最大线程池数量,如果队列满了,就会创建新的线程任务。如果与corePoolSize一样大小,

那么就是固定大小的鹅线程池;

keepAliveTime表示线程池中线程空闲时间,当空闲时间达到keepAliveTime,线程会被销毁,直到剩下corePoolSize,

默认情况只有当前的线程数大于corePoolSize时keepAliveTime才会起作用;

unit时间单位;

BlockingQueue阻塞队列。当请求线程数大于corePoolSize时,线程会进入阻塞队列,当达到阻塞队列的上限是,线程池会创建新的

线程池,最大的线程数就是maximumPoolSize;

其他参数:

threadFactory线程工厂,默认是Executors.defaultThreadFactory();

RejectedExecutionHandler拒绝策略的执行对象,当线程池数量大于maximumPoolSize,拒绝策略就会执行;

    /**
* Creates a new {@code ThreadPoolExecutor} with the given initial
* parameters and default thread factory and rejected execution handler.
* It may be more convenient to use one of the {@link Executors} factory
* methods instead of this general purpose constructor.
*
* @param corePoolSize the number of threads to keep in the pool, even
* if they are idle, unless {@code allowCoreThreadTimeOut} is set
* @param maximumPoolSize the maximum number of threads to allow in the
* pool
* @param keepAliveTime when the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
* @param unit the time unit for the {@code keepAliveTime} argument
* @param workQueue the queue to use for holding tasks before they are
* executed. This queue will hold only the {@code Runnable}
* tasks submitted by the {@code execute} method.
* @throws IllegalArgumentException if one of the following holds:<br>
* {@code corePoolSize < 0}<br>
* {@code keepAliveTime < 0}<br>
* {@code maximumPoolSize <= 0}<br>
* {@code maximumPoolSize < corePoolSize}
* @throws NullPointerException if {@code workQueue} is null
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}

拒绝策略

AbortPolicy

默认拒绝策略,丢弃任务,抛出异常RejectedExecutionException

DiscardPolicy

丢弃任务

DiscardOldestPolicy

把最旧的等待任务抛弃,放入等待队列

CallerRunsPolicy

拒绝任务在当前正在执行的线程运行

    /**
* A handler for rejected tasks that throws a
* {@code RejectedExecutionException}.
*/
public static class AbortPolicy implements RejectedExecutionHandler /**
* A handler for rejected tasks that silently discards the
* rejected task.
*/
public static class DiscardPolicy implements RejectedExecutionHandler /**
* A handler for rejected tasks that discards the oldest unhandled
* request and then retries {@code execute}, unless the executor
* is shut down, in which case the task is discarded.
*/
public static class DiscardOldestPolicy implements RejectedExecutionHandler /**
* A handler for rejected tasks that runs the rejected task
* directly in the calling thread of the {@code execute} method,
* unless the executor has been shut down, in which case the task
* is discarded.
*/
public static class CallerRunsPolicy implements RejectedExecutionHandler

例子

package com.java.javabase.thread.base.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* @author
*/
@Slf4j
public class ThreadPoolAbortPolicyTest {
public static void main(String[] args) {
ThreadPoolExecutor pool =new ThreadPoolExecutor(1,2,0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1));
//pool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
//pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
//pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
pool.execute(() -> log.info("thread {} 0", Thread.currentThread().getName()));
pool.execute(() -> log.info("thread {} 1", Thread.currentThread().getName()));
pool.execute(() -> log.info("thread {} 2", Thread.currentThread().getName()));
pool.execute(() -> log.info("thread {} 3", Thread.currentThread().getName()));
pool.execute(() -> log.info("thread {} 4", Thread.currentThread().getName()));
pool.shutdown();
}
}

DiscardOldestPolicy结果

2019-08-14 15:56:18,972   [pool-1-thread-1] INFO  ThreadPoolAbortPolicyTest  - thread pool-1-thread-1 0
2019-08-14 15:56:18,972 [pool-1-thread-1] INFO ThreadPoolAbortPolicyTest - thread pool-1-thread-1 4
2019-08-14 15:56:18,972 [pool-1-thread-2] INFO ThreadPoolAbortPolicyTest - thread pool-1-thread-2 2

CallerRunsPolicy结果

2019-08-14 15:58:03,439   [pool-1-thread-1] INFO  ThreadPoolAbortPolicyTest  - thread pool-1-thread-1 0
2019-08-14 15:58:03,439 [pool-1-thread-2] INFO ThreadPoolAbortPolicyTest - thread pool-1-thread-2 2
2019-08-14 15:58:03,454 [pool-1-thread-1] INFO ThreadPoolAbortPolicyTest - thread pool-1-thread-1 1
2019-08-14 15:58:03,439 [main] INFO ThreadPoolAbortPolicyTest - thread main 3
2019-08-14 15:58:03,454 [pool-1-thread-1] INFO ThreadPoolAbortPolicyTest - thread pool-1-thread-1 4

java并发初探ThreadPoolExecutor拒绝策略的更多相关文章

  1. java并发初探ConcurrentSkipListMap

    java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...

  2. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  3. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  4. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  5. java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...

  6. Java并发编程--ThreadPoolExecutor

    概述 为什么要使用线程池? 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立 ...

  7. Java线程池的拒绝策略

    一.简介 jdk1.5 版本新增了JUC并发编程包,极大的简化了传统的多线程开发.前面文章中介绍了线程池的使用,链接地址:https://www.cnblogs.com/eric-fang/p/900 ...

  8. JAVA并发(8)-ThreadPoolExecutor的讲解

    很久前(2020-10-23),就有想法学习线程池并输出博客,但是写着写着感觉看不懂了,就不了了之了.现在重拾起,重新写一下(学习一下). 线程池的优点也是老生常谈的东西了 减少线程创建的开销(任务数 ...

  9. java并发:初探sleep方法

    sleep与wait sleep是Thread方法,使得当前线程从运行态变为阻塞态.但它不会释放对象的锁. wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...

随机推荐

  1. idea中使用Autowired注入时报红,但是运行不报错

    在Preferences中如下设置,即可解除报红错误: 将Autowiring for Bean Class的Severity级别设置为Warning

  2. 「NOIP2016」蚯蚓

    传送门 Luogu 解题思路 很容易想到用一个堆去维护,但是复杂度是 \(O((n+m)\log(n+m))\) 的,显然过不了 \(7e6\). 其实这题有一个性质: 先被切开的蚯蚓,得到的两条新蚯 ...

  3. C#加密解密(AES)-AESHelper

    原文地址:https://ken.io/note/csharp-aesencrypt using System; namespace Encrypt { public class AESHelper ...

  4. python 环境迁移之requirements.txt (window环境)

    一.背景 1.有时候你本地用python编写代码,然后本地也安装了很多的库,那么你要迁移到服务器上,那么该怎么快速弄环境库呢?           #第二,三步就可以解决. 2.有时候你本地用pyth ...

  5. HDU5444 Elven Postman

    按要求递归建树输出~ #include<cstdio> #include<algorithm> #include<cstring> using namespace ...

  6. IoT协议LwM2M MQTT与CoAP

    IoT协议LwM2M MQTT与CoAP 一.MQTT 1.概述: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议, ...

  7. 关于雷达(Radar)信道

    有些时候,我们在实际的无线网络中,会遇到无线信道一致flapping的情况,即便我们自定义了信道的,发现也会出现flapping.如果这种情况,可能需要确认是否你使用的信道上检测到了雷达. 这里记录一 ...

  8. dojo框架笔记

    一.模块定义 1.定义只含值对,没有任何依赖的模块(moudle1.js) define({ color: "black", size: "unisize" } ...

  9. 洛谷 P1886 滑动窗口(单调队列)

    嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...

  10. Linux 修改 .bashrc

    bashrc是一个隐藏的文件,要打开并修改该文件需要: (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接按 i 键可以对文件进行 ...