美文网首页
线程池拒绝策略源码小析

线程池拒绝策略源码小析

作者: zcliu | 来源:发表于2017-11-10 15:03 被阅读0次
    • 提交一个新的task到线程池后,此时如果ThreadPool内的所有工作线程都在忙碌时(没有可用的线程去处理该task),并且任务队列也到达界限,这时候就需要用到拒绝策略。

    • 在 java.util.concurrent包下有个RejectedExecutionHandler接口,该接口定义了rejectedExecution方法,用来实现具体的拒绝行为。

    image.png
    • 再往下看,Java预定义了四种拒绝策略:


      image.png

    下面就分析一下这四种拒绝策略有什么不一样:

    AbortPolicy

    image.png

    可以看到AbortPolicy其实就是直接抛了个exception,并丢弃该task。

    DiscardPolicy

    image.png

    DiscardPolicy什么都没做,静静地丢弃该task

    DiscardOldestPolicy

    image.png

    可以看到DiscardOldestPolicy会先通过poll方法,将任务队列的队头,也就是最旧的那个任务remove掉,然后将最新的task放进线程池

    CallerRunsPolicy

    image.png

    可以看到,CallerRunsPolicy就是直接调用Runnable的实例方法run去执行该task,说白了就是该task直接由调用者线程来执行

    后记

    当然,以上四种拒绝策略只是jdk预定义的,我们也可以根据实际情况自定义拒绝策略,只需要实现RejectedExecutionHandler接口即可

    相关文章

      网友评论

          本文标题:线程池拒绝策略源码小析

          本文链接:https://www.haomeiwen.com/subject/visbmxtx.html