Java线程池并发执行任务,其中只要有一个线程任务报异常,全部任务停止demo怎么写
时间: 2024-09-27 16:07:41 浏览: 37
在Java中,如果你想要创建一个线程池,并且当有任何一个线程任务抛出异常导致程序中断时,你可以使用`ThreadPoolExecutor`结合自定义的`UncaughtExceptionHandler`来实现这个功能。这里是一个简单的示例:
```java
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class ExceptionHandlingThreadPool {
private static final int THREAD_POOL_SIZE = 5;
private ExecutorService executorService;
public ExceptionHandlingThreadPool() {
// 创建一个线程池,设置拒绝策略为AbortPolicy(一旦线程池满并且有新的任务进来,就会直接抛出RejectedExecutionException)
executorService = new ThreadPoolExecutor(
THREAD_POOL_SIZE,
THREAD_POOL_SIZE, // 线程池大小
0L, // 阻塞时间
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(),
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
// 设置自定义的未捕获异常处理器
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("Uncaught exception in worker thread " + t.getName());
// 如果有一个线程抛出了未捕获异常,中断所有任务并关闭线程池
executorService.shutdownNow();
throw new RuntimeException(e); // 将异常向上抛出,终止整个程序
}
});
return thread;
}
});
}
public void executeTask(Runnable task, String taskName) {
try {
executorService.execute(() -> {
System.out.println("Starting task: " + taskName);
// 这里替换为你实际的任务代码,如果任务抛出异常,将触发uncaughtExceptionHandler
throw new Exception("Simulating an exception for demo purposes");
});
} catch (RejectedExecutionException ree) {
System.out.println("Rejected Execution due to unhandled exception");
}
}
public static void main(String[] args) {
ExceptionHandlingThreadPool pool = new ExceptionHandlingThreadPool();
// 执行一些任务
pool.executeTask(() -> {}, "Task 1");
pool.executeTask(() -> {}, "Task 2");
pool.executeTask(() -> {}, "Task 3");
}
}
```
在这个例子中,每个新提交的任务都会在其运行的线程上注册自定义的未捕获异常处理器。如果任何线程抛出未捕获的异常,它会打印一条消息,然后中断其他正在执行的任务,并关闭线程池。
阅读全文