首页 > 其他分享 > AbortPolicy(默认策略)

AbortPolicy(默认策略)

时间:2024-09-15 15:52:53浏览次数:13  
标签:策略 Thread executor 默认 任务 线程 AbortPolicy new ThreadPoolExecutor

1. AbortPolicy(默认策略)

特点:当任务无法被线程池执行时,会抛出一个RejectedExecutionException异常。


使用场景:适用于对任务丢失敏感的场景,当线程池无法接受新任务时,希望立即知道并处理该异常。


示例代码:


import java.util.concurrent.*;


public class AbortPolicyDemo {

   public static void main(String[] args) {

       ThreadPoolExecutor executor = new ThreadPoolExecutor(

               2, 2, 0L, TimeUnit.MILLISECONDS,

               new LinkedBlockingQueue<>(2),

               new ThreadPoolExecutor.AbortPolicy());


       for (int i = 0; i < 5; i++) {

           executor.submit(() -> {

               System.out.println("Task " + Thread.currentThread().getName() + " is running.");

               try {

                   Thread.sleep(1000);

               } catch (InterruptedException e) {

                   Thread.currentThread().interrupt();

               }

           });

       }


       executor.shutdown();

   }

}


2. CallerRunsPolicy

特点:当任务无法被线程池执行时,会直接在调用者线程中运行这个任务。如果调用者线程正在执行一个任务,则会创建一个新线程来执行被拒绝的任务。


使用场景:适用于可以容忍任务在调用者线程中执行的业务场景,它允许任务继续执行,而不会因为线程池资源不足而被丢弃。


示例代码:


import java.util.concurrent.*;


public class CallerRunsPolicyDemo {

   public static void main(String[] args) {

       ThreadPoolExecutor executor = new ThreadPoolExecutor(

               2, 2, 0L, TimeUnit.MILLISECONDS,

               new LinkedBlockingQueue<>(2),

               new ThreadPoolExecutor.CallerRunsPolicy());


       for (int i = 0; i < 5; i++) {

           executor.submit(() -> {

               System.out.println("Task " + Thread.currentThread().getName() + " is running.");

               try {

                   Thread.sleep(1000);

               } catch (InterruptedException e) {

                   Thread.currentThread().interrupt();

               }

           });

       }


       executor.shutdown();

   }

}


3. DiscardPolicy

特点:当任务无法被线程池执行时,任务将被直接丢弃,不抛出异常,也不执行任务。


使用场景:适用于对任务丢失不敏感的场景,当线程池无法接受新任务时,简单地丢弃被拒绝的任务。


示例代码:


import java.util.concurrent.*;


public class DiscardPolicyDemo {

   public static void main(String[] args) {

       ThreadPoolExecutor executor = new ThreadPoolExecutor(

               2, 2, 0L, TimeUnit.MILLISECONDS,

               new LinkedBlockingQueue<>(2),

               new ThreadPoolExecutor.DiscardPolicy());


       for (int i = 0; i < 5; i++) {

           executor.submit(() -> {

               System.out.println("Task " + Thread.currentThread().getName() + " is running.");

               try {

                   Thread.sleep(1000);

               } catch (InterruptedException e) {

                   Thread.currentThread().interrupt();

               }

           });

       }


       executor.shutdown();

   }

}


标签:策略,Thread,executor,默认,任务,线程,AbortPolicy,new,ThreadPoolExecutor
From: https://blog.51cto.com/u_16271212/12024457

相关文章