国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java多線程之FutureTask的介紹及使用

瀏覽:88日期:2022-08-11 10:42:06
目錄一、FutureTask的理解二、FutureTask類圖三、FutureTask類中常用方法四、FutureTask類的使用示例一、FutureTask的理解

FutureTask屬于java.util.concurrent 包;FutureTask表示可取消的異步計算。FutureTask類提供了一個Future的基本實(shí)現(xiàn) ,具有啟動和取消計算的方法,查詢計算是否完整,并檢索計算結(jié)果。結(jié)果只能在計算完成后才能檢索; 如果計算尚未完成,則get方法將阻止。 一旦計算完成,則無法重新啟動或取消計算(除非使用runAndReset()調(diào)用計算 )。

二、FutureTask類圖

Java多線程之FutureTask的介紹及使用

從上面的FutureTask類圖中可以看出,F(xiàn)utureTask實(shí)現(xiàn)了RunnableFuture接口,RunnableFuture接口繼承了Runnable接口和Future接口,所以FutureTask兼?zhèn)銻unnable和Future兩種特性

Java多線程之FutureTask的介紹及使用Java多線程之FutureTask的介紹及使用

三、FutureTask類中常用方法

Java多線程之FutureTask的介紹及使用

1、構(gòu)造方法

public FutureTask(Callable callable) 創(chuàng)建一個 FutureTask ,它將在運(yùn)行時執(zhí)行給定的 Callable 。 參數(shù): callable表示可調(diào)用任務(wù) 。 public FutureTask(Runnable runnable,V result) 創(chuàng)建一個 FutureTask ,將在運(yùn)行時執(zhí)行給定的 Runnable ,并安排 get將在成功完成后返回給定的結(jié)果。 參數(shù):runnable 表示可運(yùn)行的任務(wù) ;result 表示成功完成后返回的結(jié)果。

2、常用的方法

public boolean isCancelled() 如果此任務(wù)在正常完成之前取消,則返回 true 。 public boolean isDone() 返回true如果任務(wù)已完成。 public V get() 等待計算完成,然后檢索其結(jié)果。 public V get(long timeout, TimeUnit unit)如果需要等待最多在給定的時間計算完成,然后檢索其結(jié)果(如果可用)。 public boolean cancel(boolean mayInterruptIfRunning)嘗試取消執(zhí)行此任務(wù)。 protected void set(V v)將此未來的結(jié)果設(shè)置為給定值,除非此未來已被設(shè)置或已被取消。四、FutureTask類的使用示例

示例參考此博文:Java FutureTask類使用

案例場景通過示例進(jìn)行多任務(wù)計算,通過get()方法可以異步獲取執(zhí)行結(jié)果。

1、創(chuàng)建一個計算任務(wù)類,實(shí)現(xiàn)Callable接口,重寫call方法

package com.xz.thread.FutureTask;import java.util.concurrent.Callable;/** * @description: 創(chuàng)建一個計算任務(wù)類,實(shí)現(xiàn)Callable接口,重寫call方法 * @author: xz * @create: 2021-06-02 22:06 */public class ComputeTask implements Callable<Integer> { private String taskName;//任務(wù)名稱 //任務(wù)構(gòu)造器 public ComputeTask(String taskName) {this.taskName = taskName;System.out.println('創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:' + taskName); } //計算任務(wù)的方法 @Override public Integer call() throws Exception {Integer result = 0;for (int i = 1; i <=50; i++) { result = +i;}System.out.println('【計算任務(wù)】'+taskName +'執(zhí)行完成。');return result; }}

2、創(chuàng)建一個測試類

package com.xz.thread.FutureTask;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask;/** * @description: * @author: xz * @create: 2021-06-01 22:44 */public class Demo { public static void main(String[] args) {//任務(wù)集合List<FutureTask<Integer>> futureTasks = new ArrayList<>();//創(chuàng)建固定長度的線程池ExecutorService pool = Executors.newFixedThreadPool(5);for (int i = 1; i <= 10; i++) { //實(shí)例化FutureTask,傳入計算任務(wù)類 FutureTask<Integer> futureTask = new FutureTask<>(new ComputeTask(i + '')); //添加到任務(wù)集合中 futureTasks.add(futureTask); //提交任務(wù)到線程池 pool.submit(futureTask);}System.out.println('所有【計算任務(wù)】提交完畢,主線程開始執(zhí)行');System.out.println('【主線程任務(wù)】開始============');//主線程睡眠5秒,模擬主線程做某些任務(wù)try { Thread.sleep(5000); System.out.println('【主線程任務(wù)】開始執(zhí)行某些任務(wù)============');} catch (InterruptedException e) { e.printStackTrace();}System.out.println('【主線程任務(wù)】結(jié)束============');//用于打印任務(wù)執(zhí)行結(jié)果Integer result = 0;for (FutureTask<Integer> task : futureTasks) { try {//FutureTask的get()方法會自動阻塞,知道得到任務(wù)執(zhí)行結(jié)果為止result += task.get(); } catch (InterruptedException e) {e.printStackTrace(); } catch (ExecutionException e) {e.printStackTrace(); }}//關(guān)閉線程池pool.shutdown();System.out.println('多線程多任務(wù)執(zhí)行結(jié)果:' + result); }}

3、輸出結(jié)果如下:

創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:1創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:2創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:3創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:4創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:5創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:6創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:7創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:8創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:9創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:10所有【計算任務(wù)】提交完畢,主線程開始執(zhí)行【主線程任務(wù)】開始============【計算任務(wù)】1執(zhí)行完成。【計算任務(wù)】2執(zhí)行完成。【計算任務(wù)】6執(zhí)行完成。【計算任務(wù)】7執(zhí)行完成。【計算任務(wù)】9執(zhí)行完成。【計算任務(wù)】10執(zhí)行完成。【計算任務(wù)】8執(zhí)行完成。【計算任務(wù)】4執(zhí)行完成。【計算任務(wù)】3執(zhí)行完成。【計算任務(wù)】5執(zhí)行完成。【主線程任務(wù)】開始執(zhí)行某些任務(wù)============【主線程任務(wù)】結(jié)束============多線程多任務(wù)執(zhí)行結(jié)果:500

Java多線程之FutureTask的介紹及使用

4、結(jié)論

通過FutureTask類的get()方法可用于異步獲取執(zhí)行結(jié)果,無論FutureTask調(diào)用多少次run()或者call()方法,它都能確保只執(zhí)行一次Runable或Callable任務(wù)。

到此這篇關(guān)于Java多線程之FutureTask的介紹及使用的文章就介紹到這了,更多相關(guān)Java FutureTask內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本加勒比一区 | 日本成人免费在线视频 | 国产成人综合日韩精品婷婷九月 | 在线国产一区二区三区 | 在线观看日本免费视频大片一区 | 成人免费视频网站 | 国产成人精品三级在线 | 免费观看成为人视频 | 成人在线高清 | 国产盗摄一区二区三区 | 国产成人亚洲综合91精品555 | 成人午夜影视全部免费看 | 欧美亚洲日本一区二区三区浪人 | 成人看片黄a免费看视频 | 天堂色网站| 黄色国产免费观看 | 亚洲特黄视频 | 亚洲精品国产综合一线久久 | 97在线观看完整免费 | 国产三级香港在线观看 | 日本成人免费在线视频 | 久久久久久免费一区二区三区 | 精品视频一区二区三区四区 | 中文字幕日韩精品有码视频 | 一级特黄性色生活片一区二区 | 中国美女隐私无遮挡免费视频 | 亚洲国产精品第一区二区 | 日韩精品欧美激情国产一区 | 亚洲一级大片 | 欧美手机在线视频 | 一区二区三区欧美在线 | 欧美精品午夜毛片免费看 | 国产一级毛片午夜 | 久久精品在现线观看免费15 | 五月色婷婷综合开心网亚 | 亚洲天堂色网站 | 久久视频这里只精品3国产 久久视频这里只有精品 | 91精品国产高清久久久久久91 | 午夜三级网站 | 好看的亚洲视频 | 99久热在线精品视频播 |