通過(guò)代碼示例了解submit與execute的區(qū)別
(1)可以接受的任務(wù)類型
submit:

execute:

可以看出:
execute只能接受Runnable類型的任務(wù)
submit不管是Runnable還是Callable類型的任務(wù)都可以接受,但是Runnable返回值均為void,所以使用Future的get()獲得的還是null
(2)返回值
由Callable和Runnable的區(qū)別可知:
execute沒(méi)有返回值
submit有返回值,所以需要返回值的時(shí)候必須使用submit
(3)異常
1.execute中拋出異常
execute中的是Runnable接口的實(shí)現(xiàn),所以只能使用try、catch來(lái)捕獲CheckedException,通過(guò)實(shí)現(xiàn)UncaughtExceptionHande接口處理UncheckedException
即和普通線程的處理方式完全一致
2.submit中拋出異常
不管提交的是Runnable還是Callable類型的任務(wù),如果不對(duì)返回值Future調(diào)用get()方法,都會(huì)吃掉異常
先來(lái)看下Callable定義
public interface Callable<V> {
V call() throws Exception;
}
其中的call能夠拋出Exception異常,所以不管是CheckedException還是UncheckedException,直接拋出即可
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadExceptionTest {
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
Future<Boolean> future = executor.submit(new CallableTask());
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
executor.shutdown();//必須不能忘,否則會(huì)一致卡在那里
}
}
class CallableTask implements Callable<Boolean>{
public Boolean call() throws Exception {
// InputStream in = new FileInputStream(new File("xx.pdf"));
int num = 3/0;
return false;
}
}
結(jié)果為:
java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) at java.util.concurrent.FutureTask.get(FutureTask.java:83) at my.ThreadExceptionTest.main(ThreadExceptionTest.java:21) Caused by: java.lang.ArithmeticException: / by zero at my.CallableTask.call(ThreadExceptionTest.java:57) at my.CallableTask.call(ThreadExceptionTest.java:1) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中使用裝飾設(shè)計(jì)模式實(shí)現(xiàn)動(dòng)態(tài)增強(qiáng)對(duì)象功能
裝飾設(shè)計(jì)模式是Java中一種常用的設(shè)計(jì)模式,它通過(guò)動(dòng)態(tài)地將功能透明地附加到對(duì)象上,以擴(kuò)展對(duì)象的功能。裝飾設(shè)計(jì)模式主要應(yīng)用于需要?jiǎng)討B(tài)、透明地增強(qiáng)對(duì)象功能的場(chǎng)景。在Java中,裝飾設(shè)計(jì)模式可通過(guò)繼承、接口和代理等方式實(shí)現(xiàn)2023-04-04
SpringCloud中的@RefreshScope注解與使用場(chǎng)景方式
SpringCloud中的@RefreshScope注解用于動(dòng)態(tài)刷新Bean配置,解決外部配置變化時(shí)的問(wèn)題,避免重啟應(yīng)用,通過(guò)本文的詳細(xì)介紹,希望讀者能夠更好地掌握@RefreshScope的使用技巧,在實(shí)際項(xiàng)目中靈活應(yīng)用,提升微服務(wù)應(yīng)用的動(dòng)態(tài)配置管理能力2024-12-12
SpringBoot導(dǎo)出Excel的四種實(shí)現(xiàn)方式
近期接到了一個(gè)小需求,要將系統(tǒng)中的數(shù)據(jù)導(dǎo)出為Excel,且能將Excel數(shù)據(jù)導(dǎo)入到系統(tǒng),對(duì)于大多數(shù)研發(fā)人員來(lái)說(shuō),這算是一個(gè)最基本的操作了,本文就給大家總結(jié)一下SpringBoot導(dǎo)出Excel的四種實(shí)現(xiàn)方式,需要的朋友可以參考下2024-01-01
Mybatis-Plus中的@TableName 和 table-prefix使用
table-prefix 是一個(gè)全局配置,它會(huì)自動(dòng)在所有表名前添加指定的前綴,這個(gè)配置對(duì)于那些使用一致命名約定的數(shù)據(jù)庫(kù)表非常有用,這篇文章主要介紹了Mybatis-Plus中的@TableName 和 table-prefix使用,需要的朋友可以參考下2024-08-08
Mybatis-plus操作json字段實(shí)戰(zhàn)教程
這篇文章主要介紹了Mybatis-plus操作json字段實(shí)戰(zhàn)教程,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
詳解Java 序列化與反序列化(Serialization)
這篇文章主要介紹了Java 序列化與反序列化(Serialization),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí) 吧2019-03-03
Spring中獲取Bean對(duì)象的三種注入方式與兩種注入方法詳解
平常的Java開(kāi)發(fā)中程序員在某個(gè)類中需要依賴其它類的方法,下面這篇文章主要給大家介紹了關(guān)于Spring中獲取Bean對(duì)象的三種注入方式與兩種注入方法的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
spring boot actuator監(jiān)控超詳細(xì)教程
Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據(jù)的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據(jù),接下來(lái)通過(guò)本文給大家介紹spring boot actuator監(jiān)控超詳細(xì)教程,感興趣的朋友一起看看吧2021-10-10
最流行的java后臺(tái)框架spring quartz定時(shí)任務(wù)
近日項(xiàng)目開(kāi)發(fā)中需要執(zhí)行一些定時(shí)任務(wù),比如需要在每天凌晨時(shí)候,分析一次前一天的日志信息,借此機(jī)會(huì)整理了一下定時(shí)任務(wù)的幾種實(shí)現(xiàn)方式,由于項(xiàng)目采用spring框架,所以我都將結(jié)合spring框架來(lái)介紹2015-12-12
Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下2024-07-07

