网站开发及代运营,用帝国cms做门户网站,房地产项目网站,勒流顺德网站建设文章目录 一、简介二、AbortPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 三、CallerRunsPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 四、DiscardPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 五、DiscardOldes… 文章目录 一、简介二、AbortPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 三、CallerRunsPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 四、DiscardPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 五、DiscardOldestPolicy拒绝策略A. 概述B. 拒绝策略实现原理C. 应用场景D. 使用示例 六、总结各种拒绝策略的特点和适用场景 一、简介
在Java多线程编程中我们通常使用线程池来管理和调度任务。线程池由一组预先创建的线程组成可以重复利用这些线程来执行多个任务避免频繁地创建和销毁线程而带来的性能开销。
当线程池中的任务队列已满且无法再接受新的任务时就需要采取拒绝策略来处理这种情况。拒绝策略定义了当无法再接受新的任务时如何处理这些被拒绝的任务。
Java提供了四种常见的拒绝策略 AbortPolicy抛出异常默认的拒绝策略。当任务无法被提交给线程池时会直接抛出RejectedExecutionException异常。 CallerRunsPolicy调用者运行当任务无法被提交给线程池时会由提交任务的线程自己执行该任务。 DiscardPolicy直接丢弃当任务无法被提交给线程池时直接丢弃该任务没有任何提示或处理。 DiscardOldestPolicy丢弃最旧任务当任务无法被提交给线程池时会丢弃队列中最早的一个任务然后尝试再次提交当前任务。
二、AbortPolicy拒绝策略
A. 概述
AbortPolicy是ThreadPoolExecutor的默认拒绝策略当任务无法被提交给线程池时会直接抛出RejectedExecutionException异常。
B. 拒绝策略实现原理
实现RejectedExecutionHandler接口在rejectedExecution方法中抛出异常。
public class AbortPolicy implements RejectedExecutionHandler {public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {throw new RejectedExecutionException(Task r.toString() rejected from e.toString());}
}C. 应用场景
适用于对任务提交失败要求敏感的场景需要明确知道任务是否被接受并执行。
D. 使用示例
当线程池的任务队列和线程队列都已满的情况下执行决绝策略
public class Task implements Runnable {private final int index;public Task(int index) {this.index index;}Overridepublic void run() {System.out.println(Thread.currentThread().getName() index);}
}public class Main {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(1, 1, 0L,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new ThreadPoolExecutor.AbortPolicy());try {// 提交任务threadPool.execute(new Task(1));threadPool.execute(new Task(2));threadPool.execute(new Task(3));} catch (RejectedExecutionException e) {e.printStackTrace();} finally {// 关闭线程池threadPool.shutdown();}}
}三、CallerRunsPolicy拒绝策略
A. 概述
CallerRunsPolicy是一种简单的拒绝策略当任务无法被提交给线程池时会由提交任务的线程自己执行该任务。
B. 拒绝策略实现原理
实现RejectedExecutionHandler接口在rejectedExecution方法中使用提交任务的线程来执行任务。
public class CallerRunsPolicy implements RejectedExecutionHandler {public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {if (!e.isShutdown()) {r.run();}}
}C. 应用场景
适用于对任务提交失败要求较低的场景通过调用线程来执行任务避免任务丢失。
D. 使用示例
public class Task implements Runnable {private final int index;public Task(int index) {this.index index;}Overridepublic void run() {System.out.println(Thread.currentThread().getName() index);}
}public class Main {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(1, 1, 0L,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new ThreadPoolExecutor.CallerRunsPolicy());try {// 提交任务threadPool.execute(new Task(1));threadPool.execute(new Task(2));threadPool.execute(new Task(3));} catch (RejectedExecutionException e) {e.printStackTrace();} finally {// 关闭线程池threadPool.shutdown();}}
}四、DiscardPolicy拒绝策略
A. 概述
DiscardPolicy是一种简单的拒绝策略当任务无法被提交给线程池时会直接丢弃该任务没有任何提示或处理。
B. 拒绝策略实现原理
实现RejectedExecutionHandler接口在rejectedExecution方法中不做任何操作即丢弃任务。
public class DiscardPolicy implements RejectedExecutionHandler {public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {// Do nothing, discard the task}
}C. 应用场景
适用于对任务提交失败不敏感的场景对任务丢失没有特殊要求。
D. 使用示例
public class Task implements Runnable {private final int index;public Task(int index) {this.index index;}Overridepublic void run() {System.out.println(Thread.currentThread().getName() index);}
}public class Main {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(1, 1, 0L,TimeUnit.SECONDS,new LinkedBlockingQueue(1),new ThreadPoolExecutor.DiscardOldestPolicy());try {// 提交任务threadPool.execute(new Task(1));threadPool.execute(new Task(2));threadPool.execute(new Task(3));} catch (RejectedExecutionException e) {e.printStackTrace();} finally {// 关闭线程池threadPool.shutdown();}}
}五、DiscardOldestPolicy拒绝策略
A. 概述
DiscardOldestPolicy是一种拒绝策略当任务无法被提交给线程池时会丢弃最早的一个任务然后尝试再次提交。
B. 拒绝策略实现原理
实现RejectedExecutionHandler接口在rejectedExecution方法中从队列中获取最早的任务并丢弃再次提交当前任务。
public class DiscardOldestPolicy implements RejectedExecutionHandler {public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {if (!e.isShutdown()) {e.getQueue().poll();e.execute(r);}}
}C. 应用场景
适用于对新任务优先级比较高的场景可以丢弃旧的任务以保证及时处理新任务。
D. 使用示例
public class Task implements Runnable {private final int index;public Task(int index) {this.index index;}Overridepublic void run() {System.out.println(Thread.currentThread().getName() index);}
}public class Main {public static void main(String[] args) {// 创建线程池ThreadPoolExecutor threadPool new ThreadPoolExecutor(1, 1, 0L,TimeUnit.SECONDS,new LinkedBlockingQueue(2),new ThreadPoolExecutor.DiscardOldestPolicy());try {// 提交任务threadPool.execute(new Task(1));threadPool.execute(new Task(2));threadPool.execute(new Task(3));threadPool.execute(new Task(4));} catch (RejectedExecutionException e) {e.printStackTrace();} finally {// 关闭线程池threadPool.shutdown();}}
}六、总结
各种拒绝策略的特点和适用场景
AbortPolicy对任务提交失败要求敏感需要明确知道任务是否被接受并执行。CallerRunsPolicy对任务提交失败要求较低通过调用线程来执行任务避免任务丢失。DiscardPolicy对任务提交失败不敏感对任务丢失没有特殊要求。DiscardOldestPolicy适用于新任务优先级高丢弃旧任务以保证及时处理新任务。