`

ThreadPoolExecutor的拒绝策略RejectedExecutionHandler

 
阅读更多
并发编程--线程池Executor(一)

http://blog.csdn.net/qq924862077/article/details/75305297

在分析ThreadPoolExecutor的构造参数时,有一个RejectedExecutionHandler参数。

RejectedExecutionHandler是一个接口:
public interface RejectedExecutionHandler {
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}


里面只有一个方法。当要创建的线程数量大于线程池的最大线程数的时候,新的任务就会被拒绝,就会调用这个接口里的这个方法。

可以自己实现这个接口,实现对这些超出数量的任务的处理。

ThreadPoolExecutor自己已经提供了四个拒绝策略,分别是CallerRunsPolicy,AbortPolicy,DiscardPolicy,DiscardOldestPolicy
这四个拒绝策略其实一看实现方法就知道很简单

自定义拒绝策略
通过看前面的系统提供的四种拒绝策略可以看出,拒绝策略的实现都非常简单。自己写亦一样
比如现在想让被拒绝的任务在一个新的线程中执行,可以这样写:
static class MyRejectedExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        new Thread(r,"新线程"+new Random().nextInt(10)).start();
    }
}

然后正常使用:
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 2, 30,
        TimeUnit.SECONDS,
        new LinkedBlockingDeque<Runnable>(2),
        new MyRejectedExecutionHandler());


参考:http://blog.csdn.net/qq_25806863/article/details/71172823

java多线程 ThreadPoolExecutor 策略的坑
无论是使用jdk的线程池ThreadPoolExecutor 还是spring的线程池ThreadPoolTaskExecutor 都会使用到一个阻塞队列来进行存储线程任务。

   当线程不够用时,则将后续的任务暂存到 阻塞队列中,等待有空闲线程来进行。

  当这个阻塞队列满了的时候,会出现两种情况

   正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;

   正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会通过一个策略进行对后续的任务进行处理。
参考:https://www.cnblogs.com/lic309/p/4564507.html

ThreadPoolExecutor详解
http://blog.csdn.net/lipc_/article/details/52025993

Java Executor并发框架(三)ThreadFactory介绍
http://blog.csdn.net/pfnie/article/details/52756738

ThreadPoolExecutor线程池参数设置技巧
https://www.cnblogs.com/waytobestcoder/p/5323130.html
分享到:
评论

相关推荐

    Java线程池的拒绝策略实现详解

    最后,让我们通过一个简单的示例代码来演示如何使用ThreadPoolExecutor和RejectedExecutionHandler接口来实现线程池的拒绝策略。 ```java package com.cfang; import java.util.concurrent.BlockingQueue; import ...

    线程池原理-ThreadPoolExecutor源码解析

    线程池原理-ThreadPoolExecutor源码解析 1.构造方法及参数 2.阻塞对列: BlockingQueue 3.线程工厂: DefaultThreadFactory 4.拒绝策略: RejectedExecutionHandler 5.执行线程 Executor

    ThreadPoolExecutor运转机制介绍

    如果当前线程池中的线程数量已经达到 `maximumPoolSize`,那么将会根据 `RejectedExecutionHandler` 的拒绝策略来处理新任务。 4. **线程的销毁**:当线程池中的线程数量大于 `corePoolSize` 时,那些超过 `...

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    handler表示线程池对拒绝任务的处理策略。 二、线程池的使用 使用ThreadPoolExecutor类可以创建一个线程池,线程池可以维护一定数量的线程,用于执行任务。任务可以通过execute(Runnable)方法被添加到线程池,任务...

    线程池ThreadPoolExecutor原理源码分析.md

    - 如果放入任务失败或线程池状态发生变化(如变为 `SHUTDOWN`),则采取拒绝策略处理任务。 4. **创建非核心线程**: - 如果任务队列已满或者线程池状态不允许放入新任务,尝试创建非核心线程来立即处理新任务。 ...

    线程池ThreadPoolExecutor使用简介与方法实例

    * handler:线程池对拒绝任务的处理策略 二、线程池ThreadPoolExecutor的使用简介 当我们使用ThreadPoolExecutor时,需要首先创建一个ThreadPoolExecutor对象,然后将任务提交给线程池。任务可以是任何实现了...

    使用线程池ThreadPoolExecutor 抓取论坛帖子列表

    4. 当线程数达到最大值且任务队列已满,新提交的任务会被拒绝,此时可以设置一个`RejectedExecutionHandler`来处理这种情况,例如丢弃任务或抛出异常。 在实际应用中,我们可能还需要关注线程池的监控和调优,例如...

    7000字+24张图带你彻底弄懂线程池.md

    线程池创建的时候,如果不指定拒绝策略就默认是AbortPolicy策略。当然,你也可以自己实现RejectedExecutionHandler接口,比如将任务存在数据库或者缓存中,这样就数据库或者缓存中获取到被拒绝掉的任务了。

    ThreadPool.zip

    2. **创建线程池**:使用ThreadPoolExecutor构造函数,传入上述配置参数,以及线程工厂ThreadFactory(用于创建新线程)和拒绝策略RejectedExecutionHandler(处理无法执行的任务)。 3. **提交任务**:通过...

    线程池使用示例(含源代码)

    在提供的"线程池示例"文件中,应该包含了创建和使用线程池的代码示例,你可以参考并进行扩展,例如添加更多任务、调整线程池参数,或者实现自定义的线程工厂和拒绝策略,以加深对线程池的理解。

    java线程池

    示例代码`TestThreadPool`创建了一个线程池,其中corePoolSize为2,maximumPoolSize为4,keepAliveTime为3秒,工作队列大小为3,拒绝策略为`ThreadPoolExecutor.CallerRunsPolicy()`。这意味着当工作队列满时,提交...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    `ThreadPoolTaskExecutor`提供了丰富的功能,如自定义拒绝策略、线程工厂、线程池的关闭等。例如,我们可以设置一个自定义的`RejectedExecutionHandler`来处理当任务无法被线程池接受时的情况,或者通过`shutdown`和...

    threadPoolDemo

    - **拒绝策略(RejectedExecutionHandler handler)**:当线程池和工作队列都满时,处理新提交任务的策略,常见的有AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。 2. **线程池的生命周期*...

    java 线程池

    7. **拒绝策略(RejectedExecutionHandler)**:当线程池和任务队列都满时,新任务的处理策略。常见的策略有抛出异常、直接忽略、调用系统守护线程执行或取消任务。 `ThreadPoolExecutor`的创建通常使用`Executors`...

    java线程池面试知识.docx

    当线程数达到`maximumPoolSize`且队列已满,线程池会根据配置的拒绝策略`RejectedExecutionHandler`来处理新任务。 1.2 Java线程池的核心配置 1) `corePoolSize`: 核心线程数,这些线程即使在没有任务需要执行时也...

    Android线程池管理的代码例子

    // 拒绝策略 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler); ``` ...

    spring 线程池实例

    5. `rejectedExecutionHandler`:拒绝策略,当线程池和任务队列都无法接受新任务时,该策略将决定如何处理。 在Spring配置文件中,我们可以这样定义一个`ThreadPoolTaskExecutor`: ```xml &lt;!-- 可选的...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    6. `rejectedExecutionHandler`(可选):拒绝策略,当工作队列也满了,且线程池达到最大线程数时,线程池会执行此策略处理新提交的任务。常见的拒绝策略包括抛出异常、调用`AbortPolicy`(默认)、丢弃最旧任务或...

    线程池java写的代码

    当线程池无法接受新任务时,可以通过实现`RejectedExecutionHandler`接口自定义拒绝策略: - `AbortPolicy`:默认策略,抛出`RejectedExecutionException`异常。 - `CallerRunsPolicy`:调用者运行,由提交任务的...

Global site tag (gtag.js) - Google Analytics