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


相关推荐

  • java 拦截器的作用?

    java 拦截器的作用?转载注明出处~1.拦截器都是做什么的?做的事和请求和响应有关。(比如前端的css或者一些加载的路径都会走这个拦截器)访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证可以不破坏你的业务逻辑在你的业务之外做一些其他事情~.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,…

    2022年5月18日
    27
  • sublime text 3 + python配置,完整搭建及常用插件安装

    sublime text 3 + python配置,完整搭建及常用插件安装公众号:战渣渣四年的时间,一直使用EmEditor编辑器进行Python开发,之前是做面向过程,只需要将一个单独的py文件维护好即可,用着也挺顺手,但是最近在做面向对象的开发,不同的py文件中相互关联较多,感觉单纯使用EmEditor编辑器确实有些低效(主要是对EmEditor的插件都不熟悉,然后逐个py文件的查找)。在网上搜索了一些Python开发的编辑器和IDE,有…

    2022年7月11日
    15
  • Netty框架的下载「建议收藏」

    1.Netty框架Jar包的下载:上图中标记的点都需要√上,并且文件夹的位置表示,会将下载好的Netty中的相关文件放在指定的目录下的lib文件夹下面。然后点击搜索,在下拉框中选择合适的版本进行下载…

    2022年4月11日
    54
  • android全屏显示隐藏状态栏_怎么调整手机状态栏的大小

    android全屏显示隐藏状态栏_怎么调整手机状态栏的大小状态栏全透明步骤:1,反编译SystemUI.apk2,SystemUI\res\layout\navigation_bar.xml找到将后面的android:background=”#FF000000″改为android:background=”#00000000″3,SystemUI\res\layout\status_bar.xml找到将后面的android:background=”@dra…

    2022年9月1日
    4
  • mpeg4标准包含{xvid\divx,h264\avc}

    mpeg4标准包含{xvid\divx,h264\avc}“MPEG-4由一系列的子标准组成,被称为部……………………………第二部(ISO/IEC14496-2):视讯:定义了一个对各种视觉信息(包括视讯,静止纹理,计算机合成图形等等)的编解码器。对视讯部分来说,众多”Profiles”中很常用的一种是AdvancedSimpleProfile(ASP),例如XviD编码就属于MPEG-4

    2022年9月18日
    1
  • 交易真的能稳定盈利吗_如何在股市稳定盈利

    交易真的能稳定盈利吗_如何在股市稳定盈利作为一个已经稳定盈利的人,我来解答下吧。我主要做外汇,期货和期权,A股也做,但是中国的股票你们知道的,做空的限制太多,融券融不到,股指期货还限制开仓和提高杠杆率。所以要等一个轮回需要5年以上,所以股票等待建仓机会比较漫长。从交易者的层面来看,我一般把他们分为这么几类人:一,幼儿园阶段:无知者无畏这种人没做过交易,只是从朋友那里听说,交易能赚大钱,或者是书刊杂志上读了一些交易大师的成功学传记,然后就跟打了鸡血似的,觉得自己也能和他们一样在金融市场赚到很多钱,这些人没有风控意识,甚至感觉这个市场

    2022年10月4日
    2

发表回复

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

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