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)文章
java實(shí)現(xiàn)網(wǎng)站微信掃碼支付
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)站微信掃碼支付,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07使用Java代碼進(jìn)行因數(shù)分解和求最小公倍數(shù)的示例
這篇文章主要介紹了使用Java代碼進(jìn)行因數(shù)分解和求最小公倍數(shù)的示例,都是基于最基礎(chǔ)的算法原理實(shí)現(xiàn),需要的朋友可以參考下2015-11-11SpringBoot集成Kaptcha驗(yàn)證碼的詳細(xì)過(guò)程
Kaptcha是一個(gè)強(qiáng)大而靈活的Java驗(yàn)證碼生成庫(kù),通過(guò)合理的配置和使用,它可以有效地提高web應(yīng)用的安全性,防止自動(dòng)化程序的濫用,這篇文章主要介紹了SpringBoot集成Kaptcha驗(yàn)證碼,需要的朋友可以參考下2024-07-07SpringBoot停止啟動(dòng)時(shí)測(cè)試檢查rabbitmq操作
這篇文章主要介紹了SpringBoot停止啟動(dòng)時(shí)測(cè)試檢查rabbitmq操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java?synchronized底層實(shí)現(xiàn)原理以及鎖優(yōu)化
Synchronized是Java中解決并發(fā)問(wèn)題的一種最常用的方法,也是最簡(jiǎn)單的一種方法,下面這篇文章主要給大家介紹了關(guān)于Java?synchronized底層實(shí)現(xiàn)原理以及鎖優(yōu)化的相關(guān)資料,需要的朋友可以參考下2022-02-02