zoukankan      html  css  js  c++  java
  • 线程池(4)-参数-RejectedExecutionHandler

    1.介绍

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

    2.拒绝策略4个

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

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

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

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

    3.示例

    3.1.AbortPolicy捕获异常

    public class RejectedAbortPolicy {
    
        static class MyRunnable implements Runnable {
            private String jobName;
    
            MyRunnable(String jobName) {
                this.jobName = jobName;
            }
    
            @Override
            public void run() {
                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 void main(String[] args) throws InterruptedException {
            ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1),
                    Executors.defaultThreadFactory(), new AbortPolicy());
            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 class RejectedDiscardOldestPolicy {
        static class MyRunnable implements Runnable {
            private String jobName;
    
            MyRunnable(String jobName) {
                this.jobName = jobName;
            }
    
            public String getJobName(){
                return jobName;
            }
            
            @Override
            public void run() {
                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 void main(String[] args) throws InterruptedException {
            BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(1);
            ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, workQueue,
                    Executors.defaultThreadFactory(), new ThreadPoolExecutor.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 class RejectedCallerRunsPolicy {
        static class MyRunnable implements Runnable {
            private String jobName;
    
            MyRunnable(String jobName) {
                this.jobName = jobName;
            }
    
            public String getJobName(){
                return jobName;
            }
            
            @Override
            public void run() {
                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 void main(String[] args) throws InterruptedException {
            BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(1);
            ExecutorService es = new ThreadPoolExecutor(2, 2, 0, TimeUnit.SECONDS, workQueue,
                    Executors.defaultThreadFactory(), new ThreadPoolExecutor.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"));
        }
    }
  • 相关阅读:
    【转载】实时嵌入式软件开发的25个常见错误
    软件测试高级测评师培训-白盒测试所用工具
    SQL update select语句
    JS对URL字符串进行编码/解码分析
    Java利用jacob实现文档格式转换
    Web打印--Lodop API
    常用正则表达式
    截取视频第一帧作为预览图片
    plupload api
    URL特殊字符的转义
  • 原文地址:https://www.cnblogs.com/SmilingEye/p/11752844.html
Copyright © 2011-2022 走看看