`

Java多线程高并发高级篇(三)--线程池核心中拒绝策略解密

 
阅读更多

在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) {
        }
    }

 

  • 大小: 5.5 KB
  • 大小: 13.3 KB
分享到:
评论

相关推荐

    JAVA高级工程师2

    在“JAVA高级工程师2”这一主题中,我们将深入探讨Java编程语言在安全、多线程、图形用户界面(GUI)开发、游戏制作、网络设计以及虚拟机(VM)参数优化等多个核心领域的高级知识。虽然IO(输入/输出)部分涉及较少...

    java-util-1.3.1.jar.zip

    5. **并发工具**:提供线程安全的数据结构和并发控制机制,如线程池、信号量等,提高多线程环境下的编程效率。 6. **数学与算法**:包含一些数学计算和算法实现,如大数运算、统计分析等。 7. **网络工具**:可能...

    JAVA宝典.docx

    - Java中的关键字,用来标记变量的状态,表示这个变量可以被多个线程访问,且每次读取都是最新的值。 - 主要作用在于保证了变量的可见性和一定程度上的有序性。 - **CAS (Compare and Swap)**: - 一种原子操作,...

    Java网络程序设计 (PDF)

    Java提供了Thread类和Runnable接口来创建和管理线程,ExecutorService和Future接口提供了更高级的线程池管理。 通过阅读《Java网络程序设计》这本书,开发者将深入理解上述知识点,并能熟练运用Java进行网络应用的...

    jvm 调优笔记-jvm.zip

    - **Parallel GC**:多线程垃圾收集,提高吞吐量,但可能导致较长的停顿时间。 - **CMS(Concurrent Mark Sweep)GC**:并行标记,低暂停时间,适合响应时间敏感的应用。 - **G1(Garbage-First)GC**:新一代...

    JAVA API_中文

    4. **多线程**:Java内置了Thread类和Runnable接口,支持并发编程。通过继承Thread或实现Runnable,开发者可以创建并控制多个执行线程。此外,ExecutorService和Future接口提供了高级的线程池管理功能。 5. **反射*...

    Java文件管理系统源代码

    这个系统对于理解和学习Java的I/O流、多线程、安全性和加密算法等方面的知识具有很高的价值。下面将详细解释其中涉及的关键技术点。 1. **Java I/O流**: Java的I/O流库提供了对文件进行读写操作的基础。在文件...

    Java高新技术

    1. **高并发处理**:Java提供了一套强大的并发API,包括线程池(ExecutorService)、Future、BlockingQueue等,这些工具使得开发者能够高效地管理多个任务并行执行。同时,Java内存模型(JMM)确保了多线程环境下的...

    Java群聊天室

    Java群聊天室是一款基于Java编程语言开发的多用户实时交流平台,它采用了多线程技术以确保用户间的并发通信,并且在数据传输过程中融入了网络安全的加密机制,以保障信息的隐私与安全性。这个程序的核心设计是实现一...

    JAVA工具模块TBOX

    8. **线程和并发工具类(ThreadUtil, ConcurrentUtil)**:线程和并发是多线程编程的关键,TBOX提供的这两个工具类,可以帮助开发者控制线程的执行、同步,以及实现线程池等高级功能。 9. **其他工具类**:除了上述的...

    JAVA面试题总汇:j2ee面试知识.pdf

    - **多线程和并发:** Java的线程创建方式、同步机制、线程池的使用,以及并发编程中常见的问题如死锁、活锁的处理。 #### 2. Java高级特性 - **泛型:** 泛型类、接口、方法的定义和使用,类型擦除和泛型通配符的...

    Java版QQ软件源代码

    Java版QQ软件源代码是Java编程领域中一个极具学习价值的项目,它为开发者提供了深入理解网络通信、多线程编程、图形用户界面设计以及Java技术应用的实践平台。QQ作为一款广泛使用的即时通讯软件,其Java版本的实现...

    JAVA程序GOHOME自动抢票

    在自动抢票程序中,Java可以提供稳定的运行环境和高效的处理能力,确保程序在高并发环境下依然能够快速响应。 其次,自动抢票的核心是模拟用户操作,这涉及到网络请求和网页解析。Java的HttpURLConnection或者...

    Java开发手册(嵩山版).pdf.zip

    5. **多线程**:涉及到线程安全、同步机制、线程池的使用、并发工具类的应用,帮助开发者写出高效且安全的多线程程序。 6. **集合框架**:讲解了ArrayList、LinkedList、HashMap、ConcurrentHashMap等常用集合的...

    学习总结desswww

    **多线程编程**:Java提供了强大的并发支持,如线程池、锁机制(synchronized、ReentrantLock等)、并发容器(ConcurrentHashMap、CopyOnWriteArrayList)以及并发工具类(CountDownLatch、CyclicBarrier)等,这些...

    java网络聊天软件课程设计.pdf

    报告题目:基于C/S结构的...完成这个Java网络聊天软件课程设计,学生不仅能深入理解C/S架构,还能掌握Java网络编程、多线程、UI设计及数据库操作等技能。此项目对于提升实际问题解决能力和团队协作能力具有重要意义。

    JAVA源码JAVA公共资源模块的设计与开发(源代码+论文)

    - **并发控制**:针对多线程环境下的资源访问问题,采用锁机制和线程池等技术进行优化。 #### 五、实现细节 ##### 1. 数据加密模块实现 数据加密模块是整个项目中非常关键的部分之一。它采用了多种加密算法,包括...

    java常用代码工具包

    4. **线程与并发**:Java的多线程和并发控制是其强大之处,工具包可能提供线程安全的数据结构,或者简化同步和线程池管理的工具。 5. **异常处理**:异常处理是Java编程中不可或缺的部分,工具包可能包含了一些...

    Mina2.0学习笔记

    - **多线程阻塞服务器**:使用线程池管理线程。 - **使用JDK自带线程池的阻塞服务器**:进一步优化线程管理。 - **NIO基础知识**:介绍Buffer、Channel、Selector等基本概念。 - **基于NIO的阻塞服务器**:利用...

    JAVA案例开发集锦3

    4. **并发与多线程**:探讨Java中并发编程的概念、工具和最佳实践,如线程池、同步机制等。 5. **GUI应用开发**:介绍如何使用JavaFX、Swing等库来创建图形用户界面(GUI)应用程序。 6. **单元测试与自动化**:教授...

Global site tag (gtag.js) - Google Analytics