Java线程池中线程拒绝策略介绍

1、线程池中的四种线程策略作用

拒绝策略:在使用Java线程池的时候,堵塞队列满了的情况下对新任务采用的策略,默认策略是AbortPolicy,我们可以使用Java提供的拒绝策略或者自己继承ThreadFacotry重写拒绝策略,下面介绍一下Java提供的拒绝策略有哪些

1.1、CallerRunsPolicy

如果线程池没关闭则使用当前线程执行任务,否则抛弃任务

 
 1 /*
 2       * 运行被拒绝任务的被拒绝任务处理程序
 3       * 直接在{@code execute}方法的调用线程中,
 4       * 除非执行器已关闭,否则将执行任务
 5       * 被丢弃。
 6    */
 7 public static class CallerRunsPolicy implements RejectedExecutionHandler {
 8     /**
 9      * Creates a {@code CallerRunsPolicy}.
10      */
11     public CallerRunsPolicy() { }
12 
13     /**
14       除非执行者执行,否则在调用者的线程中执行任务r
15       *已关闭,在这种情况下,该任务将被丢弃。
16       *
17       * @param r请求执行的可运行任务
18       * @param e试图执行此任务的执行者
19      */
20     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
21         if (!e.isShutdown()) {
22             r.run();
23         }
24     }
25 }

 

  

1.2、AbortPolicy

拒绝执行任务,并抛出异常

 
/**
  *拒绝任务的处理程序抛出一个
   * {@code RejectedExecutionException}。
  */
 public static class AbortPolicy implements RejectedExecutionHandler {
     /**
      * Creates an {@code AbortPolicy}.
      */
     public AbortPolicy() { }
 ​
     /**
       * 总是抛出RejectedExecutionException。
       * @param r请求执行的可运行任务
       * @param e试图执行此任务的执行者
       * @总是抛出RejectedExecutionException
      */
     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
         throw new RejectedExecutionException("Task " + r.toString() +
                                              " rejected from " +
                                              e.toString());
     }
 }

 

1.3、DiscardPolicy

默默拒绝任务

 
/**
   处理被拒绝任务的处理程序,将其静默丢弃
  *拒绝任务。
  */
 public static class DiscardPolicy implements RejectedExecutionHandler {
     /**
      * Creates a {@code DiscardPolicy}.
      */
     public DiscardPolicy() { }
 ​
     /**
       *不执行任何操作,具有丢弃任务r的作用。
       *
       * @param r请求执行的可运行任务
       * @param e试图执行此任务的执行者
      */
     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
     }
 }

 

1.4、DiscardOldestPolicy

丢弃最前面的任务,将当前任务加入到队列

 
/**
   *拒绝任务的处理程序,丢弃最旧的未处理程序
   *请求,然后重试{@code execute},除非执行者
   *被关闭,在这种情况下该任务被丢弃。
   */
 public static class DiscardOldestPolicy implements RejectedExecutionHandler {
     /**
      * Creates a {@code DiscardOldestPolicy} for the given executor.
      */
     public DiscardOldestPolicy() { }
 ​
     /**
       *获取并忽略执行者的下一个任务
       *如果立即可用,则将执行;
       *,然后重试任务r的执行,除非执行者
       *被关闭,在这种情况下,任务r被丢弃。
       *
       * @param r请求执行的可运行任务
       * @param e试图执行此任务的执行者
      */
     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
         if (!e.isShutdown()) {
             e.getQueue().poll();
             e.execute(r);
         }
     }
 }

 

 

posted @ 2020-12-07 17:38  jainz  阅读(275)  评论(0)    收藏  举报