java线程池拒绝策略有哪些?

小伙伴们知道java中线程池拒绝策略有哪些吗?这是java线程池必须知道的基础之一,下面就一起来看看吧。

java线程池中,有着这么四种拒绝策略:

1)、AbortPolicy(默认)

直接抛出RejectedExecutionException异常阻止系统正常运行。

    public static class AbortPolicy implements RejectedExecutionHandler
    {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e)
        {
            throw new RejectedExecutionException("Task " + r.toString() +
                " rejected from " +
                e.toString());
        }
    }

2)、CallerRunsPolicy

“调用者运行”一种调节机制,该策略既不会丢弃任务,也不会抛出异常,而是将某些任务回退给调用者,从而降低新任务的流量。

    public static class CallerRunsPolicy implements RejectedExecutionHandler
    {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e)
        {
            if (!e.isShutdown())
            {
                r.run();
            }
        }
    }

3)、DiscardOldestPolicy

抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。

    public static class DiscardOldestPolicy implements RejectedExecutionHandler
    {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e)
        {
            if (!e.isShutdown())
            {
                e.getQueue()
                    .poll();
                e.execute(r);
            }
        }
    }

这里 e.getQueue() 是获得待执行的任务队列,也就是前面提到的待业队列。

因为是队列,所以是先进先出的,一个poll()方法就能直接把队列中最老的抛弃掉,再次尝试执行execute(r)。

这个队列在线程池定义的时候就能看到,是一个阻塞队列

    /**
     * The queue used for holding tasks and handing off to worker
     * threads.  We do not require that workQueue.
     */
    private final BlockingQueue < Runnable > workQueue;
    public BlockingQueue < Runnable > getQueue()
    {
        return workQueue;
    }

4)、DiscardPolicy

直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。

    public static class DiscardPolicy implements RejectedExecutionHandler
    {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e)
        {}
    }

以上就是关于java线程池拒绝策略的所有内容了,你应该都理解了吧,如果还需要了解更多java常见问题及答案就请一定记得关注奇Q工具网噢。

推荐阅读:

java创建线程池的几种方式是什么?该怎么实现?

线程池大小一般设计成cpu多少倍为好?CPU性能详解

线程池原理都有哪些?线程池是什么?