线程池(4)-参数-RejectedExecutionHandler

摘要:
1.介绍当线程池线程数大于最大线程数时,多余的任务,程序应该按照什么拒绝策略处理。

1.介绍

当线程池线程数大于最大线程数(maximumPoolSize)时,多余的任务,程序应该按照什么拒绝策略处理。

2.拒绝策略4个

AbortPolicy:丢弃任务,并抛出RejectedExecutionException异常(需要在调用线程处捕获异常,即执行submit线程处)

DiscardPolicy:丢弃任务,不抛出异常

DiscardOldestPolicy:丢弃等待队列最前面任务

CallerRunsPolicy:由调用线程处理该任务

3.示例

3.1.AbortPolicy捕获异常

public classRejectedAbortPolicy {

    static classMyRunnable implements Runnable {
        privateString jobName;

        MyRunnable(String jobName) {
            this.jobName =jobName;
        }

        @Override
        public voidrun() {
            try{
                while (true) {
                    Thread.currentThread();
                    Thread.sleep(1000);
                    System.err.println("当前线程:" + Thread.currentThread().getName() + "当前任务:" +jobName);
                }
            } catch(InterruptedException e) {
                //TODO Auto-generated catch block
e.printStackTrace();
            }
        }
    }

    public static voidmain(String[] args) throws InterruptedException {
        ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1),
                Executors.defaultThreadFactory(), newAbortPolicy());
        es.submit(new MyRunnable("job-1"));
        es.submit(new MyRunnable("job-2"));
        es.submit(new MyRunnable("job-3"));
        Thread.sleep(5000);
        try{
            Future<?> f = es.submit(new MyRunnable("job-4"));
            f.get();//这一句永远执行不到
        } catch(Exception e) {
            System.err.println("job-4 submit Thread pool mistake");
        }
    }
}

3.2.DiscardOldestPolicy测试丢弃等待队列最前面任务

public classRejectedDiscardOldestPolicy {
    static classMyRunnable implements Runnable {
        privateString jobName;

        MyRunnable(String jobName) {
            this.jobName =jobName;
        }

        publicString getJobName(){
            returnjobName;
        }
        
        @Override
        public voidrun() {
            try{
                while (true) {
                    Thread.currentThread();
                    Thread.sleep(1000);
                    System.err.println("当前线程:" + Thread.currentThread().getName() + "当前任务:" +jobName);
                }
            } catch(InterruptedException e) {
                //TODO Auto-generated catch block
e.printStackTrace();
            }
        }
    }

    public static voidmain(String[] args) throws InterruptedException {
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(1);
        ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, workQueue,
                Executors.defaultThreadFactory(), newThreadPoolExecutor.DiscardOldestPolicy());
        es.execute(new MyRunnable("job-1"));
        es.execute(new MyRunnable("job-2"));
        es.execute(new MyRunnable("job-3"));
        Runnable firstRunnable =workQueue.poll();
        System.err.println("submit job-3 检查队列当前 Runnable名称:" +((MyRunnable) firstRunnable).getJobName());
        workQueue.add(firstRunnable);
        
        Thread.sleep(5000);
        es.execute(new MyRunnable("job-4"));
        Runnable SecondRunnable =workQueue.poll();
        System.err.println("submit job-4 检查队列当前 Runnable名称应该为job-4,实际为:" +((MyRunnable) SecondRunnable).getJobName());
        workQueue.add(SecondRunnable);
    }
}

3.3.CallerRunsPolicy主线程处理这个任务

public classRejectedCallerRunsPolicy {
    static classMyRunnable implements Runnable {
        privateString jobName;

        MyRunnable(String jobName) {
            this.jobName =jobName;
        }

        publicString getJobName(){
            returnjobName;
        }
        
        @Override
        public voidrun() {
            try{
                while (true) {
                    Thread.currentThread();
                    Thread.sleep(1000);
                    System.err.println("当前线程:" + Thread.currentThread().getName() + "当前任务:" +jobName);
                }
            } catch(InterruptedException e) {
                //TODO Auto-generated catch block
e.printStackTrace();
            }
        }
    }

    public static voidmain(String[] args) throws InterruptedException {
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(1);
        ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, workQueue,
                Executors.defaultThreadFactory(), newThreadPoolExecutor.CallerRunsPolicy());
        es.execute(new MyRunnable("job-1"));
        es.execute(new MyRunnable("job-2"));
        es.execute(new MyRunnable("job-3"));
        
        Thread.sleep(5000);
        es.execute(new MyRunnable("job-4"));
    }
}

免责声明:文章转载自《线程池(4)-参数-RejectedExecutionHandler》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 虚拟机(五) jvm参数及调优pycharm 使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring使用@Async注解

    本文讲述@Async注解,在Spring体系中的应用。本文仅说明@Async注解的应用规则,对于原理,调用逻辑,源码分析,暂不介绍。对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法。调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程...

Android开发——Android中常见的4种线程池(保证你能看懂并理解)

0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用,减少创建和销毁线程的性能开销。其次,能控制线程池中的并发数,否则会因为大量的线程争夺CPU资源造成阻塞。最后,线程池能够对线程进行管理,比如使用Schedu...

通俗地讲,Netty 能做什么?

https://www.zhihu.com/question/24322387/answer/78947405 作者:郭无心链接:https://www.zhihu.com/question/24322387/answer/78947405来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Netty是什么? 1)本质:J...

python之线程与线程池

# 进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程。 # 传统的不确切使用线程的程序称为只含有一个线程或单线程程序,而可以使用线程的程序被称为多线程程序,在程序中使用一个线程的方法 # 被称为多线程 # 线程的模块: # thread >> 实现线程的低级接口 # threading>>>...

不恰当使用线程池处理 MQ 消息引起的故障

现状 业务部门反应网站访问特别慢,负责运维监控的同事说MQ消息队列积压了,中间件的说应用服务器内存占用很高,GC 一直回收不了内存,GC 线程占了近 100% 的 CPU,其他的基本上都在等待,数据库很正常,完全没压力。没啥办法,线程、堆 dump 出来后,重启吧,然后应用又正常了。 分析 这种故障之前其实也碰到过了,分析了当时 dump 出来的堆后发现,...

MYSQL连接字符串参数详细解析(大全参考)

阅读目录 Connector/Net Connection String Options Reference 回到目录 Connector/Net Connection String Options Reference Database=dbname;Data Source=192.168.1.1;Port=3306;User Id=root;Pa...