使用线程池ThreadPoolExecutor调用Callable并接收返回值(用Future接收)

该示例展示了如何在Java中使用Callable接口创建可返回结果的任务,并通过ThreadPoolExecutor线程池进行异步执行。每个任务MyCallableA、MyCallableB和MyCallableC睡眠5秒后返回结果,最终总耗时约5秒,证明了任务已并发执行。
摘要由CSDN通过智能技术生成

/** MyCallableA 实现Callable接口 **/

package com.product.supermiketho.threaddemo;
import java.util.concurrent.Callable;

public class MyCallableA implements Callable<MyVo> {
    @Override
    public MyVo call() throws Exception {
        Thread.sleep(5000);
        return new MyVo("A001","A结果");
    }
}

/** MyCallableB 实现Callable接口 **/

package com.product.supermiketho.threaddemo;
import java.util.concurrent.Callable;
public class MyCallableB implements Callable<MyVo> {
    @Override
    public MyVo call() throws Exception {
        Thread.sleep(5000);
        return new MyVo("B001","B结果");
    }
}

/** MyCallableC 实现Callable接口 **/

package com.product.supermiketho.threaddemo;
import java.util.concurrent.Callable;

public class MyCallableC implements Callable<MyVo> {

    @Override
    public MyVo call() throws Exception {
        Thread.sleep(5000);
        return new MyVo("C001","c结果");
    }
}

/**测试类 **/

package com.product.supermiketho.threaddemo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 执行入口
 */
public class CallableRun {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        List<Future<Integer>> futureTasks = new ArrayList<>();
        /**
         * 参数:
         * corePoolSize–池中要保留的线程数,即使它们处于空闲状态,除非设置了allowCoreThreadTimeOut
         * maximumPoolSize–池中允许的最大线程数
         * keepAliveTime–当线程数大于核心时,这是多余的空闲线程在终止前等待新任务的最长时间。
         * unit–keepAliveTime参数的时间单位
         * workQueue–用于在执行任务之前保存任务的队列。此队列将仅保存execute方法提交的Runnable任务。
         * IllegalArgumentException–如果以下情况之一成立:corePoolSize<0 keepAliveTime<0 maximumPoolSize<=0 maximumPoolSize<corePoolSize
         * NullPointerException–如果工作队列为空
         */
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 3, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
        try {
            MyCallableA theCallable = new MyCallableA( );
            Future f = pool.submit(theCallable);
            futureTasks.add(f);

            MyCallableB theCallableB = new MyCallableB( );
            Future fB = pool.submit(theCallableB);
            futureTasks.add(fB);

            MyCallableC theCallableC = new MyCallableC( );
            Future fC = pool.submit(theCallableC);
            futureTasks.add(fC);

            System.out.println("线程 " + futureTasks.size());
            for (Future v : futureTasks) {
                MyVo obj = (MyVo) v.get();
                System.out.println( "getCode---"+obj.getCode() + "   getMsg---"+obj.getMsg());
            }
            pool.shutdown();
            long end = System.currentTimeMillis();
            System.out.println("耗时:{} ms" + (end - start));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

测试结果 :

线程 3
getCode---A001   getMsg---A结果
getCode---B001   getMsg---B结果
getCode---C001   getMsg---c结果
耗时:{} ms5041

结论:

MyCallableAMyCallableBMyCallableC 分别sleep了5s,
最后执行总耗时约为5秒,说明各线程已经异步执行(由线程池分配线程),并阻塞收集结果返回。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

supermiketho

多谢您的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值