• 线程池(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"));
        }
    }
  • 相关阅读:
    第一次作业
    习题3 作业
    人工智能原理及其运用习题3.8
    人工智能原理及其应用习题3.5
    人工智能第一次作业
    ASP.NET MVC 之CodeFirst 数据迁移
    实用小程序技巧
    通过Blogilo来写博客园的设置方法
    抢票应用总结
    微信开发--结对编程
  • 原文地址:https://www.cnblogs.com/SmilingEye/p/11752844.html
Copyright © 2020-2023  润新知