成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:193日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美黄色一区二区| 性高湖久久久久久久久| 一区二区毛片| 国产精品日韩成人| 成人av网站在线| 日韩一区二区三| 男男成人高潮片免费网站| 免费在线亚洲| 亚洲已满18点击进入久久| 日韩午夜电影| 亚洲乱码国产乱码精品精可以看| 国产精品v亚洲精品v日韩精品| 精品999久久久| 国产91对白在线观看九色| 欧美精品丝袜中出| 老司机免费视频一区二区三区| 久久精品国语| 亚洲国产日韩在线一区模特| 在线亚洲国产精品网站| 亚洲黄色尤物视频| 国产亚洲一区在线| 亚洲激情在线激情| 在线亚洲观看| 一区二区理论电影在线观看| 亚洲精品乱码久久久久久蜜桃91| 中文字幕一区二区日韩精品绯色| 91蜜桃在线观看| 久久在线观看免费| 欧美人与禽性xxxxx杂性| 亚洲国产精品激情在线观看| 欧美三级第一页| 国产精品美女视频| 一区在线观看| 亚洲精选视频在线| 国产亚洲在线观看| 午夜精品123| 在线国产电影不卡| 久久99精品国产麻豆不卡| 欧美人与z0zoxxxx视频| 国产成a人亚洲精品| 欧美电影免费提供在线观看| 风间由美一区二区三区在线观看| 精品成人一区二区| 国产综合欧美| 亚洲图片欧美视频| 色综合久久久网| 免费高清在线一区| 7777精品久久久大香线蕉| 国产iv一区二区三区| 国产日韩综合av| 亚洲无毛电影| 亚洲国产综合91精品麻豆| 久久在线精品| 国产乱码精品1区2区3区| 久久免费看少妇高潮| 亚洲国产免费看| 午夜欧美一区二区三区在线播放| 一本久道中文字幕精品亚洲嫩| 国产在线看一区| 欧美精品一区二区三区在线播放| 欧美精品国产| 一区二区三区欧美日| 久久在线精品| 国产成人综合自拍| 国产精品久久久久久久蜜臀| 久久xxxx| 国产精品中文字幕欧美| 国产欧美日韩综合精品一区二区| 99xxxx成人网| 久草这里只有精品视频| 欧美一区二区精品在线| 国产精品va| 三级久久三级久久| 欧美一区二区成人| 激情欧美日韩一区| 欧美aaaaaa午夜精品| 精品久久久久久久久久久久久久久 | 伊人久久久大香线蕉综合直播| 亚洲成人福利片| 日韩视频不卡中文| 99国内精品| 久久91精品久久久久久秒播| 国产日韩视频一区二区三区| 美女久久网站| 99久久免费视频.com| 性感美女久久精品| 欧美精品一区二区三区高清aⅴ| 亚洲免费不卡| 国产一区二区在线电影| √…a在线天堂一区| 欧美日韩成人在线一区| 欧美天天在线| 极品瑜伽女神91| 国产精品视频一二三| 在线看国产一区| 欧美二区在线| 美女在线一区二区| 国产精品入口麻豆九色| 欧美日韩免费视频| 欧美日韩一区二区三区在线视频 | 日韩av中文字幕一区二区三区| 精品盗摄一区二区三区| 蜜桃av一区| 菠萝蜜视频在线观看一区| 亚洲一区二区三区中文字幕| 日韩精品一区二区三区视频播放 | 欧美一区二区三区久久精品茉莉花| 亚洲18影院在线观看| 国产日韩欧美综合一区| 欧洲激情一区二区| 欧美破处大片在线视频| 精品一区二区久久| 亚洲精品国产一区二区三区四区在线| 日韩一区二区三区免费看 | 亚洲麻豆国产自偷在线| 日韩精品一区二| 色婷婷av一区二区三区大白胸| 欧美黄色一区| 国产一区二区精品久久91| 亚洲美女淫视频| 精品国产一区a| 日本乱人伦一区| 亚洲国产精选| 女人天堂亚洲aⅴ在线观看| 精品无人区卡一卡二卡三乱码免费卡| 一区二区三区中文在线观看| 久久综合九色综合97婷婷女人 | 亚洲视频一区在线| 精品国产乱码久久久久久久久| 色爱区综合激月婷婷| 精品电影一区| 91在线观看免费视频| 国产一区二区三区在线观看精品 | 日韩手机在线导航| 欧美自拍丝袜亚洲| 国产精品日韩高清| 狠狠色综合色区| av中文字幕亚洲| 国产精品亚洲成人| 蜜臀av性久久久久蜜臀aⅴ| 亚洲一区在线观看视频| 亚洲国产精品成人久久综合一区 | 国产午夜亚洲精品理论片色戒| 欧美精品乱人伦久久久久久| 久久视频一区| 亚洲另类视频| 激情综合在线| 欧美99久久| 成人av在线一区二区三区| 国内精品视频666| 蜜臀久久99精品久久久画质超高清| 一区二区视频在线| 国产精品麻豆99久久久久久| 久久影院视频免费| 日韩欧美成人午夜| 69p69国产精品| 欧美精品久久一区二区三区| 精品视频在线视频| 色综合久久66| 亚洲欧美日韩国产| 亚洲一区二区伦理| 亚洲一区亚洲| 亚洲欧美99| 性刺激综合网| 国产伦精品一区二区三区四区免费| 亚洲精品美女91| 亚洲免费大片| 国产精品一国产精品k频道56| 中文精品视频一区二区在线观看| 亚洲精品一区二区三区蜜桃久| 亚洲经典三级| 99国产精品99久久久久久粉嫩| 亚洲精品激情| 国产人成精品一区二区三| 国产精品毛片| 久久一区免费| 欧美视频中文字幕| 欧美另类z0zxhd电影| 91精品久久久久久久久99蜜臂| 欧美日韩三级一区二区| 欧美久久久久久久久久| 91精品国产免费| 欧美成va人片在线观看| 精品国产乱码久久久久久1区2区 | 欧美激情日韩| 国内精品久久久久久久97牛牛| 欧美日韩精品久久| 国产精品国码视频| 亚洲美女网站| 麻豆成人av| 欧美老女人在线| 日韩精品一区二区三区视频在线观看| 久久久亚洲精华液精华液精华液 | 一区二区三区在线免费观看| 天堂资源在线中文精品| 久久国产精品免费| 成人中文字幕电影| 午夜精品免费| 一区二区精品国产| 色香蕉成人二区免费|