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"));
        }
    }
  • 相关阅读:
    java多线程--定时器Timer的使用
    java多线程--线程池的使用
    java多线程--多线程基础小结
    java基础--java.util.Date类型小结
    onClickRow 事件
    C#里的SubString和Convert.ToDateTime
    jquery+easyui开发、培训文档
    Jquery函数大全
    前端最全的 API 集锦
    17个CSS知识点整理
  • 原文地址:https://www.cnblogs.com/SmilingEye/p/11752844.html
Copyright © 2011-2022 走看看