电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

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

二、FutureTask類圖

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

從上面的FutureTask類圖中可以看出,FutureTask實現了RunnableFuture接口,RunnableFuture接口繼承了Runnable接口和Future接口,所以FutureTask兼備Runnable和Future兩種特性

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

三、FutureTask類中常用方法

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

1、構造方法

public FutureTask(Callable callable) 創建一個 FutureTask ,它將在運行時執行給定的 Callable 。 參數: callable表示可調用任務 。 public FutureTask(Runnable runnable,V result) 創建一個 FutureTask ,將在運行時執行給定的 Runnable ,并安排 get將在成功完成后返回給定的結果。 參數:runnable 表示可運行的任務 ;result 表示成功完成后返回的結果。

2、常用的方法

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

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

案例場景通過示例進行多任務計算,通過get()方法可以異步獲取執行結果。

1、創建一個計算任務類,實現Callable接口,重寫call方法

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

2、創建一個測試類

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) {//任務集合List<FutureTask<Integer>> futureTasks = new ArrayList<>();//創建固定長度的線程池ExecutorService pool = Executors.newFixedThreadPool(5);for (int i = 1; i <= 10; i++) { //實例化FutureTask,傳入計算任務類 FutureTask<Integer> futureTask = new FutureTask<>(new ComputeTask(i + '')); //添加到任務集合中 futureTasks.add(futureTask); //提交任務到線程池 pool.submit(futureTask);}System.out.println('所有【計算任務】提交完畢,主線程開始執行');System.out.println('【主線程任務】開始============');//主線程睡眠5秒,模擬主線程做某些任務try { Thread.sleep(5000); System.out.println('【主線程任務】開始執行某些任務============');} catch (InterruptedException e) { e.printStackTrace();}System.out.println('【主線程任務】結束============');//用于打印任務執行結果Integer result = 0;for (FutureTask<Integer> task : futureTasks) { try {//FutureTask的get()方法會自動阻塞,知道得到任務執行結果為止result += task.get(); } catch (InterruptedException e) {e.printStackTrace(); } catch (ExecutionException e) {e.printStackTrace(); }}//關閉線程池pool.shutdown();System.out.println('多線程多任務執行結果:' + result); }}

3、輸出結果如下:

創建【計算任務】開始,計算任務名稱:1創建【計算任務】開始,計算任務名稱:2創建【計算任務】開始,計算任務名稱:3創建【計算任務】開始,計算任務名稱:4創建【計算任務】開始,計算任務名稱:5創建【計算任務】開始,計算任務名稱:6創建【計算任務】開始,計算任務名稱:7創建【計算任務】開始,計算任務名稱:8創建【計算任務】開始,計算任務名稱:9創建【計算任務】開始,計算任務名稱:10所有【計算任務】提交完畢,主線程開始執行【主線程任務】開始============【計算任務】1執行完成?!居嬎闳蝿铡?執行完成。【計算任務】6執行完成?!居嬎闳蝿铡?執行完成。【計算任務】9執行完成。【計算任務】10執行完成?!居嬎闳蝿铡?執行完成?!居嬎闳蝿铡?執行完成。【計算任務】3執行完成?!居嬎闳蝿铡?執行完成?!局骶€程任務】開始執行某些任務============【主線程任務】結束============多線程多任務執行結果:500

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

4、結論

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | TPM咨询,精益生产管理,5S,6S现场管理培训_华谋咨询公司 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 最新范文网_实用的精品范文美文网 | 北京公寓出租网-北京酒店式公寓出租平台| 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 云杂志网-学术期刊-首页| 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 电车线(用于供电给电车的输电线路)-百科| 鑫达滑石-辽宁鑫达滑石集团 | RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 成都软件开发_OA|ERP|CRM|管理系统定制开发_成都码邻蜀科技 | 中山东港家具集团-酒店-办公-医养家具定制厂家| 铜镍-康铜-锰铜-电阻合金-NC003 - 杭州兴宇合金有限公司 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 西安中国国际旅行社(西安国旅)| HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 |