java ThreadPoolExecutor 异常捕获

一,创建一个线程池

其中:

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);
        }
 
    }

 

转载于:https://www.cnblogs.com/hanjun0612/p/11542046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadPoolExecutor是Python中的一个线程池实现,它可以用于管理和调度多个线程执行任务。当线程池中的线程执行任务时,如果任务抛出异常,我们可以通过以下几种方式获取异常信息: 1. 使用submit()方法提交任务并返回一个Future对象,通过调用Future对象的result()方法获取任务执行的结果。如果任务抛出异常,result()方法会将异常重新抛出,我们可以使用try-except语句捕获并处理异常。 ```python import concurrent.futures def task(): # 任务逻辑 raise Exception("Something went wrong") with concurrent.futures.ThreadPoolExecutor() as executor: future = executor.submit(task) try: result = future.result() except Exception as e: print("Exception:", e) ``` 2. 使用add_done_callback()方法注册一个回调函数,在任务执行完成后自动调用该函数。回调函数的参数是一个Future对象,我们可以通过调用Future对象的exception()方法获取任务执行过程中抛出的异常信息。 ```python import concurrent.futures def task(): # 任务逻辑 raise Exception("Something went wrong") def handle_exception(future): try: result = future.result() except Exception as e: print("Exception:", e) with concurrent.futures.ThreadPoolExecutor() as executor: future = executor.submit(task) future.add_done_callback(handle_exception) ``` 这样,当任务执行完成后,handle_exception()函数会被自动调用,并且可以获取到任务执行过程中抛出的异常信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值