演示提交任务方法execute()、submit()的区别

本文探讨了ExecutorService的execute()和submit()提交任务的区别,包括声明位置、参数类型、返回值以及异常处理。execute()在Executor接口中,仅接受Runnable;submit()在ExecutorService接口,能接收Runnable或Callable并返回Future对象,允许获取任务结果和异常信息。
摘要由CSDN通过智能技术生成


向线程池提交任务的两个方法 execute()submit() 的区别,我总结的主要有四点

(1)申明位置不同:execute() 方法定义在 Executor 接口中,submit() 方法定义在 ExecutorService 接口中;
   ExecutorService 接口继承了 Executor 接口。

(2)可传参数不同: execute() 方法参数只能传入 Runnable 接口;submit() 方法有三个重载的方法;
在这里插入图片描述

public interface ExecutorService extends Executor {
   
     //其他代码
     Future<?> submit(Runnable task);
     <T> Future<T> submit(Runnable task, T result);
     <T> Future<T> submit(Callable<T> task);
     //其他代码
}

(3) 有无返回值不同:execute() 方法没有返回值是 void;submit() 方法用于提交需要返回值的任务。
   线程池会返回一个 future 类型的对象,通过这个 future对象可以判断任务是否执行成功
   并且可以通过future的 get() 方法来获取返回值,get() 方法会阻塞当前线程直到任务完成,
   而使用 get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,
   这时候有可能任务都还没有执行完就返回的,时间一到就会返回当前的结果。
   

(4) 如果我们希望调用者能够知道内部有 Exception 并做处理,那么就需要实现 Callable 接口,并且通过对
   Future.get() 进行抛出异常的捕获,然后对其进行处理。

演示第(4)点的代码:

package com.dai
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值