ExecutorService子线程返回值获取和exception捕获

本文介绍了如何在Java中使用ExecutorService来管理和控制并发任务,特别是如何获取Callable任务的返回值以及捕获并处理自定义异常。通过创建TaskWithResult类实现Callable接口,配合ExecutorService的submit方法,演示了如何在主线程中捕获子线程抛出的TaskException异常,以及通过errorCode进行业务错误区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中需要使用多线程的并发来处理数据,刚开始希望使用static关键字来控制总的请求数,通过加减计数来进行数据请求的调度,本来并发量就不是很高,可是在实际的实验环境中,因为不能很好的控制请求的先后顺序,达到FIFO的要求,所以准备改善优化一下。对于线程池的使用不是很熟悉,通过网上的一些实例,结合自己的实际需求,对现成的一个实例,进行了优化,希望给各位有新的启发。

根据需求,主要做两方面的改正:

1.要对子线程的结果进行判断,这要求ExecutorService的执行结果必须有返回值

2.要捕获子线程的自定义异常。

首先第1点,获取任务的执行的返回值。

ExecutorService能够执行的任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。并且Callable的call()方法只能通过ExecutorService的(<T> task) 方法来执行,并且返回一个<T><T>,是表示任务等待完成的 Future。故此选定实现接口为callable。


import java.util.Random;
import java.util.concurrent.Callable;

public class TaskWithResult implements Callable<String> {
    private int id;
    private static final String RESULT_NG_39 = "39";

    public TaskWithResult(int id) {
        this.id = id;
    }

    /**
     * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。
     *
     * @return
     * @throws Exception
     */
    public String call() throws TaskException {
        System.out.println("call()方法被自动调用,干活!!!             "
                + Thread.currentThread().getName());
        if (new Random().nextBoolean())

            // 此处为自定义的exception, 包含返回的error code,在实际的开发中,不同的错误会对应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值