当前位置:实例文章 » JAVA Web实例» [文章]ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

ThreadPoolExecutor自定义线程池|拒绝策略|线程工厂|统一捕获异常

发布人:shili8 发布时间:2025-02-16 13:19 阅读次数:0

**ThreadPoolExecutor 自定义线程池**

在 Java 中,`ThreadPoolExecutor` 是一个非常强大的类,可以帮助我们管理线程池。然而,Java 的 `ThreadPoolExecutor` 有一些缺陷,如无法自定义拒绝策略、线程工厂等。在本文中,我们将学习如何自定义 `ThreadPoolExecutor` 以适应我们的需求。

###1. 自定义拒绝策略当线程池中的线程数达到最大值时,新任务将被拒绝。我们可以通过实现 `RejectedExecutionHandler` 接口来自定义拒绝策略。

java// 自定义拒绝策略public class MyRejectedExecutionHandler implements RejectedExecutionHandler {
 @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
 System.out.println("任务被拒绝:" + r.toString());
 }
}


###2. 自定义线程工厂我们可以通过实现 `ThreadFactory` 接口来自定义线程工厂。

java// 自定义线程工厂public class MyThreadFactory implements ThreadFactory {
 @Override public Thread newThread(Runnable r) {
 Thread thread = new Thread(r);
 thread.setName("My-Thread-" + Thread.currentThread().getId());
 return thread;
 }
}


###3. 统一捕获异常在使用 `ThreadPoolExecutor` 时,我们需要统一捕获异常。我们可以通过实现 `ThreadFactory` 接口来自定义线程工厂,并在其中捕获异常。

java// 自定义线程工厂,捕获异常public class MyThreadFactory implements ThreadFactory {
 @Override public Thread newThread(Runnable r) {
 Thread thread = new Thread(r);
 thread.setName("My-Thread-" + Thread.currentThread().getId());
 thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
 @Override public void uncaughtException(Thread t, Throwable e) {
 System.out.println("线程异常:" + t.getName() + ",异常信息:" + e.getMessage());
 }
 });
 return thread;
 }
}


###4. 使用自定义线程池现在,我们可以使用自定义的 `ThreadPoolExecutor`。

java// 使用自定义线程池public class MyThreadPoolExecutor {
 public static void main(String[] args) {
 ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 最大线程数10, // 最小线程数0L, // 等待超时时间 TimeUnit.SECONDS, // 等待超时单位 new LinkedBlockingQueue(), //任务队列 new MyThreadFactory(), // 线程工厂 new MyRejectedExecutionHandler() // 拒绝策略 );

 for (int i =0; i < 20; i++) {
 executor.execute(() -> System.out.println("任务执行:" + Thread.currentThread().getName()));
 }

 executor.shutdown();
 }
}


在本文中,我们学习了如何自定义 `ThreadPoolExecutor` 以适应我们的需求。我们实现了自定义拒绝策略、线程工厂和统一捕获异常的功能,并使用这些功能创建了一个自定义的线程池。

相关标签:java开发语言
其他信息

其他资源

Top