小伙伴们知道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 workQueue;
public BlockingQueue getQueue()
{
return workQueue;
}
4)、DiscardPolicy
直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。public static class DiscardPolicy implements RejectedExecutionHandler
{
public void rejectedExecution(Runnable r, ThreadPoolExecutor e)
{}
}
以上就是关于java线程池拒绝策略的所有内容了,你应该都理解了吧,如果还需要了解更多java常见问题及答案就请一定记得关注奇Q工具网噢。
推荐阅读: