Java并发编程高级篇(十一):执行器之处理被拒绝的任务

Java并发编程高级篇(十一):执行器之处理被拒绝的任务

大家好,又见面了,我是全栈君。

我们知道在调用执行器的shutdown()方法后,再向执行器提交任务会被拒绝。执行器框架为我们提供了一个类RejectedExecutionHandler,来让我们自定义一些被拒绝任务的处理逻辑。

首先实现自定义的拒绝任务处理逻辑,继承RejectedExecutionHandler,并实现rejectedExecution方法。

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 创建执行器拒绝任务处理器
 *
 * Created by hadoop on 2016/11/3.
 */
public class RejectedTaskController implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        System.out.printf("RejectedTaskController: The task %s has been rejected.\n", r.toString());
        System.out.printf("RejectedTaskController: Executor is %s\n", executor.toString());
        System.out.printf("RejectedTaskController: Executor terminating: %s\n", executor.isTerminating());
        System.out.printf("RejectedTaskController: Executor terminated: %s\n", executor.isTerminated());
    }
}

模拟一个任务线程,实现Runnable接口。

import java.util.concurrent.TimeUnit;

/**
 *
 * Created by hadoop on 2016/11/3.
 */
public class Task implements Runnable {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        long duration = (long)(Math.random() * 10);

        System.out.printf("Task: %s will run during %d seconds\n", name, duration);

        try {
            TimeUnit.SECONDS.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return this.name;
    }
}

在主线程类中,首先初始化自定义的被拒绝任务处理器,然后把它赋值给执行器。模拟在shutdown()方法后提交任务,并观察结果。

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 处理在执行器中被拒绝的任务
 *
 * 我们使用shutdown方法来关闭执行器,但是如果当前有正在执行的任务,执行器会等待任务执行完成才会关闭。
 * 但这个时候执行期已经不再接受任何任务了,我们发送任务给执行器会被拒绝。
 * ThreadPoolExecutor提供了一套机制了处理这些被拒绝的任务。
 *
 * 我们定义了一个执行器拒绝任务储丽丽RejectedTaskController.
 * 在方法rejectedExecution(Runnable r, ThreadPoolExecutor executor)中处理被拒绝的任务。
 *
 * 需要通过执行器的setRejectedExecutionHandler(controller)方法来给执行器设置决绝任务处理器类。
 *
 * 当有任务发送给处理器的时候,会检查处理器是否被shutdown,如果shutdown那么就会调用拒绝任务处理器。
 * 如果没有定义这个拒绝任务处理器,那么就会抛出RejectedExecutionException异常。
 *
 * Created by hadoop on 2016/11/3.
 */
public class Main {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();

        RejectedTaskController controller = new RejectedTaskController();

        executor.setRejectedExecutionHandler(controller);

        for (int i = 0; i < 3; i++) {
            Task task = new Task("Task" + i);
            executor.submit(task);
        }

        executor.shutdown();

        Task task = new Task("RejectTask");
        executor.submit(task);
    }
}

控制台结果:

RejectedTaskController: The task java.util.concurrent.FutureTask@5d86aad9 has been rejected.
Task: Task1 will run during 2 seconds
Task: Task0 will run during 0 seconds
Task: Task2 will run during 8 seconds
RejectedTaskController: Executor is java.util.concurrent.ThreadPoolExecutor@767ca7f0[Shutting down, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 0]
RejectedTaskController: Executor terminating: true
RejectedTaskController: Executor terminated: false

转载于:https://my.oschina.net/nenusoul/blog/850019

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108641.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月1日 下午6:00
下一篇 2022年3月1日 下午6:00


相关推荐

  • win10 使用workon

    win10 使用workon首先设置环境变量变量名是 WORKON 变量地址是 F ENV 自己指定 进入命令行 使用命令 pipinstallvi winmkvirtual 创建虚拟环境 workon 查看有哪些虚拟环境 wo

    2026年3月18日
    2
  • Kimi发布新模型,月之暗面完成C轮融资现金储备破100亿

    Kimi发布新模型,月之暗面完成C轮融资现金储备破100亿

    2026年3月12日
    2
  • iptable 理解

    iptable 理解这个当初我理解不了,主要是没把netfilter理解清楚。Netfilter是集成在内核中的,用来定义存储各种规则的。Iptalbe是修改这些规则的工具,修改后存在netfilter里面。数据包进入LINUX服务器时,先进入服务器的netfilter模块中进行判断处理。 Netfilter包含有三种表,三种表下共包含有五种链,链下面包含各种规则。即表包含若干链,链包含若干规则。 …

    2022年5月28日
    103
  • 2020中国人口出生率下降_2020人口出生率

    2020中国人口出生率下降_2020人口出生率最新发布《中国统计年鉴2021》显示,2020年中国全国人口出生率为8.52‰,首次跌破10‰,创下了1978来的新低。同期中国人口自然增长率仅为1.45‰,同样创下1978年以来的历史新低。根据年鉴,2020年相比2019年,中国人口净增204万人,而前一年增量还高达467万,2018年增加了530万人。从现有的情况来看,人口总量增加的动力缺乏,越来越难,出生人口越来越少。发展的趋势,就是越来越接近于出生人口与死亡人口相交叉的边缘。和我之前整理的历年人口以及趋势预测不谋而合:中国历年人

    2025年9月14日
    17
  • html中三角向下符号,使用css实现三角符号效果[通俗易懂]

    html中三角向下符号,使用css实现三角符号效果[通俗易懂]关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处并不是一个直线,所以,可以根据此属性进行编写三角符号那么如何使用css的该属性来实现三角符号的效果呢,代码如下:html代码css代码div:after{position:absolute;width…

    2025年5月28日
    8
  • PreferenceActivity中的组件

    PreferenceActivity中的组件PreferenceAc 介绍 PreferenceAc 继承 ListActivity 它是以一个列表的形式在展现内容 它最主要的特点是添加 Preference 可以让控件的状态持久化储存 举个例子比如用户选中 checkbox 后退出应用然后在进入应用 这时用户希望看到的是 checkbox 被选中 所以软件须要记录用户每次操作的过程并且持久储存 在进入应用的时候须要判断

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号