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

execute:

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

