线程池(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"));
    }
}
原文地址:https://www.cnblogs.com/SmilingEye/p/11752844.html