线程池提交任务(submit 和 execute)

提交任务有execute()submit()两个方法,下面看看他俩的区别:

接收参数不同

execute()的参数只有Runnable;

ynbCjS.png

submit()既可以提交Runnable类型的任务,也可以提交Callable类型的任务。
ynqP8x.png
ynqErD.png

返回值不同

execute() 没有返回值;

submit() 有返回值Future通过Future可以获取各个线程的完成情况,是否有异常,还能试图取消任务的执行

异常处理不同

execute()在执行任务时,如果遇到异常会直接抛出;

submit()不会直接抛出,只有在使用Future#get方法获取返回值时,才会抛出异常

假设我有很多更新各种数据的task,我希望如果其中一个task失败,其它的task就不需要执行了。那我就需要catch Future#get抛出的异常,然后终止其它task的执行。

下面看个使用submit()获取返回值的例子:

public static void main(String[] args) {

    // 创建固定大小的线程池
    // return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
    ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
    System.out.println("threadPool start...");

    // 提交任务 submit(Callable<T> task), 获取 任务的future
    Future<Integer> future = threadPool.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            try {
                // 主动触发算术异常
                // int a = 10 / 0;
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 111;
        }
    });

    // 通过 future#isDone 可以 查看 task 线程是否完成;
    // 其实,只要 task 的 call 方法结束,
    // 1 无论是 正常结束, 还时 异常结束,都代表任务已经结束,统一返回true

    // 通过 future#get 可以 得到 task线程的返回值;
    // get 方法是同步阻塞方法,会阻塞到任务结束为止,
    // 1 一般和future#isDone 配合使用,轮询任务的状态
    // 2 如果 任务线程中途 (被取消,发生异常,被中断),get 方法都会抛出异常

    Integer value = -1;
    try {
        // 轮询判断任务是否完成
        for (; ; ) {
            // 如果 任务完成
            if (future.isDone()) {
                // 阻塞到任务完成为止
                // 这里 不会诸塞,因为任务明显完成了
                value = future.get();
                System.out.println("任务顺利完成,future#isDone=" + future.isDone() + ", 返回值=" + value);
                break;
            } else {
                // 任务未完成
                System.out.println("任务未完成, future#isDone=" + future.isDone());
                Thread.sleep(1000);
            }
        }
    } catch (InterruptedException | ExecutionException e) {
        // 任务发生异常,future#isDone 返回 true
        System.out.println("任务执行期间发生异常, future#isDone=" + future.isDone() +", 返回值=" + value);
        e.printStackTrace();
    }

    // 等待其他任务完成,最后才关闭线程池
    threadPool.shutdown();
    System.out.println("end。。。");
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值