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

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

淺談Java獲得多線程的返回結果方式(3種)

瀏覽:113日期:2022-08-30 18:06:30

一:Java創建線程方式

繼承Thread類或者實現Runnable接口。但是Runnable 的 run() 方法是不帶返回值的,那如果我們需要一個耗時任務在執行完之后給予返回值,應該怎么做呢?

第一種方法:在 Runnable 的實現類中設置一個變量 V,在 run 方法中將其改變為我們期待的結果,然后通過一個 getV() 方法將這個變量返回。

package com.test.thread;import java.util.*;import sun.swing.AccumulativeRunnable;//獲得線程的返回結果方式一/* *在runnable實現類中設置一個變量x,在run方法中將其改變為我們期待的結果,然后通過一個getX()方法將這個變量返回 */public class RunnableTest { public static void main(String[] args) throws Exception { System.out.println('使用Runnable獲取返回結果'); List<Thread> workers = new ArrayList<>(10); List<RunnableAcction> tasks = new ArrayList<>(10); //創建10個線程,每個線程分別負責累加1-10,11-20,.........,91-100 for(int i=0;i<10;i++) { RunnableAcction task = new RunnableAcction(i*10+1,(i+1)*10); Thread work = new Thread(task,'累加器線程'+i); workers.add(work); tasks.add(task); work.start(); } int total = 0; for(int i = 0;i<workers.size();i++) { workers.get(i).join(); total += tasks.get(i).getResult(); } System.out.println('n累加的結果:'+total); } static final class RunnableAcction implements Runnable{ private int a; public RunnableAcction(int a, int b) { super(); this.a = a; this.b = b; } private int b; private int result; @Override public void run() { result = 0; try { for(int i=a;i<= b;i++) { result += i; Thread.sleep(100); } } catch (Exception e) { // TODO: handle exception } System.out.printf('(%s) - 運行結束,結果為 %dn',Thread.currentThread().getName(),result); } public int getResult() {//獲取線程返回結果 return result; } }}

第二種方法:使用 Callable 和 FutureTask。

使用 FutureTask 的過程如下:(1)通過一個 Callable 任務或者一個 Runnable(一開始就指定 result)任務構造 FutureTask;(2)將 FutureTask 交給 Thread 去運行;(3)使用 FutureTask 的 get 方法(或者 Thread 的 join 方法)阻塞當前線程直到獲得任務的結果。

import java.util.*;import java.util.concurrent.*;public class CallableTest { public static void main(String[] args) throws Exception { System.out.println('使用 Callable 獲得返回結果:');List<FutureTask<Integer>> futureTasks = new ArrayList<>(10); // 新建 10 個線程,每個線程分別負責累加 1~10, 11~20, ..., 91~100 for (int i = 0; i < 10; i++) { AccumCallable task = new AccumCallable(i * 10 + 1, (i + 1) * 10); FutureTask<Integer> futureTask = new FutureTask<>(task); futureTasks.add(futureTask); Thread worker = new Thread(futureTask, '慢速累加器線程' + i); worker.start(); } int total = 0; for (FutureTask<Integer> futureTask : futureTasks) { total += futureTask.get(); // get() 方法會阻塞直到獲得結果 } System.out.println('累加的結果: ' + total); } static final class AccumCallable implements Callable<Integer> { private final int begin; private final int end; public AccumCallable(int begin, int end) { this.begin = begin; this.end = end; } @Override public Integer call() throws Exception { int result = 0; for (int i = begin; i <= end; i++) {result += i;Thread.sleep(100); } System.out.printf('(%s) - 運行結束,結果為 %dn', Thread.currentThread().getName(), result); return result; } } }

二:FutureTask介紹

FutureTask可用于異步獲取執行結果或取消執行任務的場景。通過傳入Runnable或者Callable的任務給FutureTask,直接調用其run方法或者放入線程池執行,之后可以在外部通過FutureTask的get方法異步獲取執行結果。因此,**FutureTask非常適合用于耗時的計算,主線程可以在完成自己的任務后,再去獲取結果。**另外,FutureTask還可以確保即使調用了多次run方法,它都只會執行一次Runnable或者Callable任務,或者通過cancel取消FutureTask的執行等。

一個FutureTask 可以用來包裝一個 Callable 或是一個runnable對象。因為FurtureTask實現了Runnable方法,所以一個 FutureTask可以提交(submit)給一個Excutor執行(excution)。

FutureTask執行多任務計算的使用場景:

利用FutureTask和ExecutorService,可以用多線程的方式提交計算任務,主線程繼續執行其他任務,當主線程需要子線程的計算結果時,再異步獲取子線程的執行結果。

import java.util.*;import java.util.concurrent.*;public class FutureTest1 { public static void main(String[] args) { Task task = new Task();// 新建異步任務,然后執行futureTask FutureTask<Integer> future = new FutureTask<Integer>(task) { // 異步任務執行完成,回調 @Override protected void done() {try { System.out.println('future.done():' + get());} catch (InterruptedException e) { e.printStackTrace();} catch (ExecutionException e) { e.printStackTrace();} } }; // 創建線程池(使用了預定義的配置) ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(future); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } // 可以取消異步任務 // future.cancel(true); try { // 阻塞,等待異步任務執行完畢-獲取異步任務的返回值 System.out.println('future.get():' + future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } // 異步任務 static class Task implements Callable<Integer> { // 返回異步任務的執行結果 @Override public Integer call() throws Exception { int i = 0; for (; i < 10; i++) {try { System.out.println('異步任務:'+Thread.currentThread().getName() + '_' + i); Thread.sleep(500);} catch (InterruptedException e) { e.printStackTrace();} } return i; } }}

參考文章:https://blog.csdn.net/chenliguan/article/details/54345993https://blog.csdn.net/linchunquan/article/details/22382487https://segmentfault.com/a/1190000007767231

到此這篇關于淺談Java獲得多線程的返回結果方式的文章就介紹到這了,更多相關Java 多線程的返回結果內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | hc22_hc22价格_hc22哈氏合金—东锜特殊钢| 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 旋转/数显粘度计-运动粘度测定仪-上海平轩科学仪器 | 创客匠人-让IP变现不走弯路| 辊道窑炉,辊道窑炉厂家-山东艾希尔 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 富森高压水枪-柴油驱动-养殖场高压清洗机-山东龙腾环保科技有限公司 | 双段式高压鼓风机-雕刻机用真空泵-绍兴天晨机械有限公司 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 中国品牌门窗网_中国十大门窗品牌_著名门窗品牌 | 猎头招聘_深圳猎头公司_知名猎头公司| 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | 伺服电机_直流伺服_交流伺服_DD马达_拓达官方网站 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 物流公司电话|附近物流公司电话上门取货| 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | C形臂_动态平板DR_动态平板胃肠机生产厂家制造商-普爱医疗 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 |