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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pandas drop参数_pandas concat函数

    pandas drop参数_pandas concat函数pandas中dropna()参数详解DataFrame.dropna(axis=0,how=‘any’,thresh=None,subset=None,inplace=False)1.axis参数确定是否删除包含缺失值的行或列axis=0或axis=’index’删除含有缺失值的行,axis=1或axis=’columns’删除含有缺失值的列,importpandasaspdimportnumpyasnpdf=pd.DataFrame({“name”:[‘Alfr

    2022年9月18日
  • Java两种动态代理JDK动态代理和CGLIB动态代理[通俗易懂]

    Java两种动态代理JDK动态代理和CGLIB动态代理[通俗易懂]目录代理模式JDK动态代理cglib动态代理测试代理模式代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现类,A则比较“虚”,他借用了B的方法去实现接口的方法。A虽然是“伪军”,但它可以增强B,在调用B的方法前后都做些其他的事情。SpringAOP…

    2022年6月14日
  • linux 查看网卡以及开启网卡「建议收藏」

    linux 查看网卡以及开启网卡「建议收藏」解决Error:Nosuitabledevicefound:nodevicefoundforconnection”Systemeth0″解决使用VMware克隆出来的新虚拟机无法联网的问题一.背景我们安装好了一个虚拟机,我想做分布式集群,想模拟几台服务器,这时就想直接复制已经有的安装好的虚拟机,这样比较省事,不要在重复的安装虚拟机并配置JAVA环境,省…

    2022年10月19日
  • Java程序猿的JavaScript学习笔记(3——this/call/apply)

    Java程序猿的JavaScript学习笔记(3——this/call/apply)

    2022年1月21日
  • Pycharm远程开发_pycharm远程linux开发

    Pycharm远程开发_pycharm远程linux开发需要使用远程的linux服务器,但是因为pycharm很方便、希望在自己电脑上开发。这里直接使用pycharm进行远程开发。1.配置连接配置连接可以点击test_connection进行测试2.映射文件夹为了上传本地文件到服务器,以及把服务器下载到本地,需要分别设置这两个文件夹的路径3.设置编译器连接好了服务器,设置好了文件映射关系,接下来就是要使用远端的服务器了。设置成服务器端的解释器跟路径就行。(路径好像是根据之前的设置生成的)4.使用写一个简单的代码,run一下其实

    2022年8月25日

发表回复

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

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