java ThreadPoolExecutor 异常捕获
2023-09-11 14:21:22 时间
一,创建一个线程池
其中:
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor)
饱和策略执行时的具体逻辑。
protected void afterExecute(Runnable r, Throwable t)
异常后的具体逻辑。
package com.kintech.scanAF.common; import com.kintech.common.utils.log.LogerHelper; import java.util.concurrent.*; /** * @author Tyler * @date 2019/9/12 */ public class ThreadHelper { //初始化线程池 private static final ExecutorService pool = new ThreadPoolExecutor( 2, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardPolicy(){ public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { LogerHelper.Write("--- "+this.getClass().getName()+"\r\n--- 队列已满,请稍后再来"); } }) { @Override protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); LogerHelper.Write(t.getMessage()); System.out.println(t.getMessage()); } }; /** * 执行线程池方法(方法在RunnableFunc文件夹中) * @param run */ public static void execute(Runnable run) { pool.execute(run); } /** * 执行线程池方法(方法在RunnableFunc文件夹中) * @param run */ public static Future<?> submit(Runnable run) { Future<?> future = pool.submit(run); return future; } }
线程池的参数介绍:
public ThreadPoolExecutor( int corePoolSize, // 线程数量 int maximumPoolSize, // 最大线程数量 long keepAliveTime, // 线程存活时间 TimeUnit unit, //时间单位 BlockingQueue<Runnable> workQueue, // 任务队列 ThreadFactory threadFactory, // 线程创建工厂,可以给线程起名字 RejectedExecutionHandler handler) // 饱和策略
二,创建任务
package com.kintech.scanAF.common.RunnableFunc; /** * @author Tyler * @date 2019/9/12 */ public class Test implements Runnable { private String a; public Test(String a) { this.a=a; } @Override public void run() { try { throw new RuntimeException( "Service has error !"); } catch (Exception e) { throw e; } finally { a=null; } } }
三,调用并获取异常
public void MainTest(String a) throws IOException { Future<?> future = ThreadHelper.submit(new Test(a)); try { future.get(); } catch (Exception ex) { //记录日志 LogerHelper.Write(ex.getMessage()); //swing弹窗 JOptionPane.showMessageDialog(null, ex.getMessage(), "Message", JOptionPane.ERROR_MESSAGE); } }
相关文章
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
- Java 开发环境配置--eclipse工具进行java开发
- java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException 异常解决方案
- java打印九九乘法表——CSDN博客
- Java语法基础(四)----循环结构语句
- Java实现 LeetCode 654 最大二叉树(递归)
- Java实现 LeetCode 466 统计重复个数
- Java实现 蓝桥杯 算法提高 秘密行动
- Java中环境变量PATH与CLASSPATH的区别
- Java实现 蓝桥杯VIP 算法训练 瓷砖铺放
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- [Spring学习笔记 4 ] AOP 概念原理以及java动态代理
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】毕向东Java基础视频教程-笔记
- Java异常捕获之try-catch-finally-return的执行顺序-转载
- java.lang.IllegalStateException: Failed to load ApplicationContext selenium 异常 解决
- Java中synchronized的使用实例
- 【译】11条Java异常处理的最佳实践
- Java — java.lang.NullPointerException - 如何处理空指针异常
- Java定义枚举
- Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
- Java学习路线-40:Java数据库编程基础操作
- java中的transient 详细总结Java中transient关键字 对象写出流ObjectOutputStream 对象写入流ObjectInputStream
- Java如何打印异常的堆栈?
- Java如何使用catch来处理异常?
- 【java】Java 封装