在ThreadPoolExecutor的核心构造函数中,最后一个参数就是拒绝策略处理器。拒绝策略是等待任务队列已满,并且线程池处理不了任务时候,就需要一套处理机制,去解决这个问题(是抛弃还是怎么的)。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
JDK内置了4种拒绝策略,分别是AbortPolicy,CallerRunsPolicy,DiscardOldestPolicy,DiscardPolicy。
我们介绍下这4中策略:
1、AbortPolicy
该策略会直接抛出运行时异常,阻止系统继续执行,处理方式简单粗暴。我们看源码:
public static class AbortPolicy implements RejectedExecutionHandler {
/**
* Creates an <tt>AbortPolicy</tt>.
*/
public AbortPolicy() { }
/**
* Always throws RejectedExecutionException.
* @param r the runnable task requested to be executed
* @param e the executor attempting to execute this task
* @throws RejectedExecutionException always.
*/
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException();
}
}
2、CallerRunsPolicy
只要线程池不关闭,该策略直接在调用者(Caller)线程中运行(Runs)当前被抛弃出来的任务。这么做的弊端是调用者线程(任务提交线程)的性能下降。看源码:
public static class CallerRunsPolicy implements RejectedExecutionHandler { /** * Creates a <tt>CallerRunsPolicy</tt>. */ public CallerRunsPolicy() { } /** * Executes task r in the caller's thread, unless the executor * has been shut down, in which case the task is discarded. * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { r.run(); } } }
3、DiscardOldestPolicy
只要线程池不关闭,该策略将丢弃最老的一个任务(e.getQueue().poll())并且执行最新一个要执行的任务请求,看源码:
public static class DiscardOldestPolicy implements RejectedExecutionHandler { /** * Creates a <tt>DiscardOldestPolicy</tt> for the given executor. */ public DiscardOldestPolicy() { } /** * Obtains and ignores the next task that the executor * would otherwise execute, if one is immediately available, * and then retries execution of task r, unless the executor * is shut down, in which case task r is instead discarded. * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); e.execute(r); } } }
4、DiscardPolicy
该策略啥也不做,默默的丢弃任务(我从来没有来过。。。)
public static class DiscardPolicy implements RejectedExecutionHandler { /** * Creates a <tt>DiscardPolicy</tt>. */ public DiscardPolicy() { } /** * Does nothing, which has the effect of discarding task r. * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }
相关推荐
在“JAVA高级工程师2”这一主题中,我们将深入探讨Java编程语言在安全、多线程、图形用户界面(GUI)开发、游戏制作、网络设计以及虚拟机(VM)参数优化等多个核心领域的高级知识。虽然IO(输入/输出)部分涉及较少...
5. **并发工具**:提供线程安全的数据结构和并发控制机制,如线程池、信号量等,提高多线程环境下的编程效率。 6. **数学与算法**:包含一些数学计算和算法实现,如大数运算、统计分析等。 7. **网络工具**:可能...
- Java中的关键字,用来标记变量的状态,表示这个变量可以被多个线程访问,且每次读取都是最新的值。 - 主要作用在于保证了变量的可见性和一定程度上的有序性。 - **CAS (Compare and Swap)**: - 一种原子操作,...
Java提供了Thread类和Runnable接口来创建和管理线程,ExecutorService和Future接口提供了更高级的线程池管理。 通过阅读《Java网络程序设计》这本书,开发者将深入理解上述知识点,并能熟练运用Java进行网络应用的...
- **Parallel GC**:多线程垃圾收集,提高吞吐量,但可能导致较长的停顿时间。 - **CMS(Concurrent Mark Sweep)GC**:并行标记,低暂停时间,适合响应时间敏感的应用。 - **G1(Garbage-First)GC**:新一代...
4. **多线程**:Java内置了Thread类和Runnable接口,支持并发编程。通过继承Thread或实现Runnable,开发者可以创建并控制多个执行线程。此外,ExecutorService和Future接口提供了高级的线程池管理功能。 5. **反射*...
这个系统对于理解和学习Java的I/O流、多线程、安全性和加密算法等方面的知识具有很高的价值。下面将详细解释其中涉及的关键技术点。 1. **Java I/O流**: Java的I/O流库提供了对文件进行读写操作的基础。在文件...
1. **高并发处理**:Java提供了一套强大的并发API,包括线程池(ExecutorService)、Future、BlockingQueue等,这些工具使得开发者能够高效地管理多个任务并行执行。同时,Java内存模型(JMM)确保了多线程环境下的...
Java群聊天室是一款基于Java编程语言开发的多用户实时交流平台,它采用了多线程技术以确保用户间的并发通信,并且在数据传输过程中融入了网络安全的加密机制,以保障信息的隐私与安全性。这个程序的核心设计是实现一...
8. **线程和并发工具类(ThreadUtil, ConcurrentUtil)**:线程和并发是多线程编程的关键,TBOX提供的这两个工具类,可以帮助开发者控制线程的执行、同步,以及实现线程池等高级功能。 9. **其他工具类**:除了上述的...
- **多线程和并发:** Java的线程创建方式、同步机制、线程池的使用,以及并发编程中常见的问题如死锁、活锁的处理。 #### 2. Java高级特性 - **泛型:** 泛型类、接口、方法的定义和使用,类型擦除和泛型通配符的...
Java版QQ软件源代码是Java编程领域中一个极具学习价值的项目,它为开发者提供了深入理解网络通信、多线程编程、图形用户界面设计以及Java技术应用的实践平台。QQ作为一款广泛使用的即时通讯软件,其Java版本的实现...
在自动抢票程序中,Java可以提供稳定的运行环境和高效的处理能力,确保程序在高并发环境下依然能够快速响应。 其次,自动抢票的核心是模拟用户操作,这涉及到网络请求和网页解析。Java的HttpURLConnection或者...
5. **多线程**:涉及到线程安全、同步机制、线程池的使用、并发工具类的应用,帮助开发者写出高效且安全的多线程程序。 6. **集合框架**:讲解了ArrayList、LinkedList、HashMap、ConcurrentHashMap等常用集合的...
**多线程编程**:Java提供了强大的并发支持,如线程池、锁机制(synchronized、ReentrantLock等)、并发容器(ConcurrentHashMap、CopyOnWriteArrayList)以及并发工具类(CountDownLatch、CyclicBarrier)等,这些...
报告题目:基于C/S结构的...完成这个Java网络聊天软件课程设计,学生不仅能深入理解C/S架构,还能掌握Java网络编程、多线程、UI设计及数据库操作等技能。此项目对于提升实际问题解决能力和团队协作能力具有重要意义。
- **并发控制**:针对多线程环境下的资源访问问题,采用锁机制和线程池等技术进行优化。 #### 五、实现细节 ##### 1. 数据加密模块实现 数据加密模块是整个项目中非常关键的部分之一。它采用了多种加密算法,包括...
4. **线程与并发**:Java的多线程和并发控制是其强大之处,工具包可能提供线程安全的数据结构,或者简化同步和线程池管理的工具。 5. **异常处理**:异常处理是Java编程中不可或缺的部分,工具包可能包含了一些...
- **多线程阻塞服务器**:使用线程池管理线程。 - **使用JDK自带线程池的阻塞服务器**:进一步优化线程管理。 - **NIO基础知识**:介绍Buffer、Channel、Selector等基本概念。 - **基于NIO的阻塞服务器**:利用...
4. **并发与多线程**:探讨Java中并发编程的概念、工具和最佳实践,如线程池、同步机制等。 5. **GUI应用开发**:介绍如何使用JavaFX、Swing等库来创建图形用户界面(GUI)应用程序。 6. **单元测试与自动化**:教授...