pelliot
snicker线程池-两种提交任务的⽅法execute()与submit()详解
引⾔
线程池中有两个提交任务的⽅法
向线程池提交任务的两种⽅式⼤致如下:
贝立兹⽅式⼀:调⽤execute()⽅法
安徽学位英语考试网
// todo 源码
cems
⽅式⼆:调⽤submit()⽅法
// todo 源码
⼀、区别
以上的submit()和execute()两类⽅法的区别在哪⾥呢?⼤致有以下三点:
aspen
1.⼆者所接收的参数不⼀样
Execute()⽅法只能接收Runnable类型的参数,⽽submit()⽅法可以接收Callable、Runnable两种类型的参数。Callable类型的任务是可以返回执⾏结果的,⽽Runnable类型的任务不可以返回执⾏结果。Callable是JDK 1.5加⼊的执⾏⽬标接⼝,作为Runnable的⼀种补充,允许有返回值,允许抛出异常。Runnable和Callable的主要区别为:Callable允许有返回值,Runnable不允许有返回值;Runnable不允许抛出异常,Callable允许抛出异常。
2.submit()提交任务后会有返回值,⽽execute()没有
familiar>沙特取消波音订单execute()⽅法主要⽤于启动任务的执⾏,⽽任务的执⾏结果和可能的异常调⽤者并不关⼼。submit()⽅法也⽤于启动任务的执⾏,但是启动之后会返回Future对象,代表⼀个异步执⾏实例,可以通过该异步执⾏实例去获取结果。
3.submit()⽅便Exception处理
execute()⽅法在启动任务执⾏后,任务执⾏过程中可能发⽣的异常调⽤者并不关⼼。⽽通过submit()⽅法返回的Future对象(异步执⾏实例),可以进⾏异步执⾏过程中的异常捕获。
⼆、联系
在ThreadPoolExecutor类的实现中,内部核⼼的任务提交⽅法是execute()⽅法,虽然⽤户程序通过su
dream
bmit()也可以提交任务,但是实际上submit()⽅法中最终调⽤的还是execute()⽅法。
// todo 源码
三、实践
1.通过submit()返回的Future对象获取结果
submit()⽅法⾃⾝并不会传递结果,⽽是返回⼀个Future异步执⾏实例,处理过程的结果被包装到Future实例中,调⽤者可以通过()⽅法获取异步执⾏的结果。通过submit()返回的Future对象获取异步执⾏结果,
演⽰代码如下:todo
2.通过submit()返回的Future对象捕获异常bik
submit()⽅法⾃⾝并不会传递异常,处理过程中的异常都被包装到Future实例中,调⽤者在调⽤()⽅法获取执⾏结果时,可以捕获异步执⾏过程中抛出的受检异常和运⾏时异常,并进⾏对应的业务处理。
演⽰代码如下:todo