Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例
FutureTask實(shí)現(xiàn)異步任務(wù)
FutureTask 的執(zhí)行結(jié)果和出現(xiàn)異常的異常對(duì)象都會(huì)被放到outcome對(duì)象中,通過(guò)get()方法返回。
1.測(cè)試future任務(wù)正常返回
public class T2 {
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNamePrefix("thread-start-runner").build();
ExecutorService taskExe = new ThreadPoolExecutor(10, 20, 800L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(100), namedThreadFactory);
private static final Logger LOG = LoggerFactory.getLogger(T2.class);
@Test
public void test2() {
List<FutureTask<Integer>> taskList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int a = i;
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
LOG.info("正在進(jìn)行第" + a + "個(gè)任務(wù)");
Thread.sleep(3000);
return 1;
});
taskList.add(futureTask);
//異步執(zhí)行
taskExe.submit(futureTask);
}
LOG.info("任務(wù)添加完成");
int count = 0;
try {
for (FutureTask<Integer> task : taskList) {
/*
FutureTask執(zhí)行的結(jié)果會(huì)放入它的私有變量outcome中,其他線程直接調(diào)用futureTask.get()去讀取該變量即可
會(huì)阻塞直到單個(gè)任務(wù)執(zhí)行完畢
* */
Integer value = task.get();
LOG.info("value:" + value);
count += value;
}
} catch (InterruptedException e) {
LOG.error("線程執(zhí)行被中斷", e);
} catch (ExecutionException e) {
LOG.error("線程執(zhí)行出現(xiàn)異常", e);
}
taskExe.shutdown();
LOG.info("count:" + count);
}```執(zhí)行結(jié)果:正常累加。

2.測(cè)試future任務(wù)異常返回,通過(guò)get()方法拿到異常
@Test
public void test3() {
List<FutureTask<Integer>> taskList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int a = i;
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
LOG.info("正在進(jìn)行第" + a + "個(gè)任務(wù)");
int v=1/0;
return 1;
});
taskList.add(futureTask);
//異步執(zhí)行
taskExe.submit(futureTask);
}
LOG.info("任務(wù)添加完成");
int count = 0;
try {
for (FutureTask<Integer> task : taskList) {
/*
FutureTask執(zhí)行的結(jié)果會(huì)放入它的私有變量outcome中(包括異常),其他線程直接調(diào)用futureTask.get()去讀取該變量即可
會(huì)阻塞直到單個(gè)任務(wù)執(zhí)行完畢
* */
Integer value = task.get();
LOG.info("value:" + value);
count += value;
}
} catch (InterruptedException e) {
LOG.error("線程執(zhí)行被中斷", e);
} catch (ExecutionException e) {
LOG.error("線程執(zhí)行出現(xiàn)異常", e);
}
taskExe.shutdown();
LOG.info("count:" + count);
}執(zhí)行結(jié)果:捕獲到異常。

3.callable出現(xiàn)異常,不進(jìn)行g(shù)et()
@Test
public void test4() {
List<FutureTask<Integer>> taskList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int a = i;
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
LOG.info("正在進(jìn)行第" + a + "個(gè)任務(wù)");
int v = 1 / 0;
return 1;
});
taskList.add(futureTask);
//異步執(zhí)行
taskExe.submit(futureTask);
}
LOG.info("任務(wù)添加完成");
taskExe.shutdown();
}執(zhí)行結(jié)果:沒(méi)有拋出異常。

到此這篇關(guān)于Java中的FutureTask實(shí)現(xiàn)異步任務(wù)代碼實(shí)例的文章就介紹到這了,更多相關(guān)FutureTask實(shí)現(xiàn)異步任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn)
這篇文章主要介紹了關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn),每個(gè)方法中都要單獨(dú)寫用戶登錄驗(yàn)證的方法,即使封裝成公共方法,也一樣要傳參調(diào)用和在方法中進(jìn)行判斷,需要的朋友可以參考下2023-05-05
Spring注解實(shí)現(xiàn)循環(huán)重試功能(適用場(chǎng)景分析)
這篇文章主要介紹了Spring注解實(shí)現(xiàn)循環(huán)重試功能,本篇主要簡(jiǎn)單介紹了Springboot中的Retryable的使用,主要的適用場(chǎng)景和注意事項(xiàng),當(dāng)需要重試的時(shí)候還是很有用的,需要的朋友可以參考下2023-04-04
全面掌握J(rèn)ava中的循環(huán)控制語(yǔ)句與條件判斷語(yǔ)句的使用
這篇文章主要介紹了Java中的循環(huán)控制語(yǔ)句與條件判斷語(yǔ)句的使用,循環(huán)和判斷是Java編程中流程控制的基礎(chǔ),需要的朋友可以參考下2016-02-02
同時(shí)使用@LoadBalanced?@RefreshScope注解負(fù)載均衡失效分析
這篇文章主要為大家介紹了同時(shí)使用@LoadBalanced?@RefreshScope負(fù)載均衡失效問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問(wèn)題
這篇文章主要介紹了SpringBoot項(xiàng)目的配置文件中設(shè)置server.port不生效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

