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

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

Java使用5個線程計算數組之和

瀏覽:120日期:2022-08-12 11:41:18
目錄前言代碼一:代碼二:方式一:方式二:方式三:總結前言

之前寫過多線程累加計數,原理跟本篇類似,傳送門

累加計數比計算數組之和邏輯稍微簡單一點,如果對于這塊不熟悉的,可以先看下累加計數。

基本思想已經在之前那篇文章里寫過了,這里就直接貼代碼了。

這里分別通過自己創建線程來實現功能,還有通過線程池來實現功能。思想都差不多。只是代碼寫法略有不同。僅供參考。

代碼一:

五個線程交替累加計算數組之和,這種方法其實不如單線程直接累加快,因為交替累加需要前一個線程計算的結果。

package test; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; public class FiveThreadCount { private int count=0; private int[] arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28}; private int j=0; //定義一個任務,關鍵點所在 private class MyThread extends Thread{ @Override public void run() { super.run(); while(j<arr.length) { synchronized (MyThread.class) { if(j>=arr.length){ return; } count+=arr[j++]; try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } } } //方法一 public void test1(){ for(int i=0;i<5;i++){ new MyThread().start(); }try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }System.out.println(count); } //方法二 public void test2(){ Thread myThread=new MyThread(); for(int i=0;i<5;i++){ new Thread(myThread).start(); }try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }System.out.println(count); } //方法一的線程池實現版 public void test3(){ ExecutorService service=Executors.newCachedThreadPool(); for(int i=0;i<5;i++){ service.execute(new MyThread()); }try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }System.out.println(count); } //方法二的線程池實現版 public void test4(){ ExecutorService service=Executors.newCachedThreadPool(); Thread myThread=new MyThread(); for(int i=0;i<5;i++){ service.execute(myThread); }try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }System.out.println(count); } }

上邊代碼中,用到了sleep方法的原因,sleep(100)是為了讓其他線程有時間執行任務,如果不sleep的話,有可能一個線程就全部執行完了。 最后的sleep(10000)是為了等所有線程執行完后,打印最后的計算結果。

代碼二:

將數組分為5等分,讓每個線程計算自己負責的那份,并發計算,最后匯總結果。這種方式比代碼一速度會快些。因為線程獨立計算,不依賴其他線程的結果。最后幾個線程將總數累加即可。

方式一:

使用Callable,FutureTask方式,來實現代碼:

package test; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.FutureTask; public class FiveThreadCount2 { private int[] arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28}; private int total=0; public void test() throws InterruptedException, ExecutionException{ ExecutorService service=Executors.newFixedThreadPool(5); int length=arr.length; for(int j=0;j<length;j+=(length/5)){ FutureTask<Integer> task; if( (j+(length/5))<length){ task=new FutureTask<Integer>(new MyCallable(arr, j, j+(length/5))); }else{ task=new FutureTask<Integer>(new MyCallable(arr, j, length)); } service.execute(task); total+=task.get(); } service.shutdown(); System.out.println(total); } public class MyCallable implements Callable<Integer>{ int[] arr; int startIndex; int endIndex; public MyCallable(int[] arr,int startIndex,int endIndex){ this.arr=arr; this.startIndex=startIndex; this.endIndex=endIndex; } @Override public Integer call() throws Exception { int sum=0; for(int i=startIndex;i<endIndex;i++){ sum+=arr[i]; } System.out.println(Thread.currentThread().getName()); return sum; } } }

這個方式有一個缺點,看似5個線程異步執行,其實是順序執行,因為 task.get是要等待線程執行完畢才會執行下邊的代碼。所以效率不會高,可能換種寫法可以解決這個問題,這里就不深入研究。

方式二:

通過java工具類CountDownLatch實現并發計算

package test; import java.util.concurrent.CountDownLatch; public class FiveThreadCount3 { private int[] arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28}; private int total=0; public void test() throws InterruptedException{ int length=arr.length; CountDownLatch latch=new CountDownLatch(length%5==0?5:6); System.out.println(length); for(int j=0;j<length;j+=(length/5)){ MyThread task; if( (j+(length/5))<=length){ task=new MyThread(arr, j, j+(length/5), latch); }else{ task=new MyThread(arr, j, length, latch); } new Thread(task).start(); } latch.await(); System.out.println(total); } private class MyThread implements Runnable{ int[] arr; int startIndex; int endIndex; CountDownLatch latch; public MyThread(int[] arr,int startIndex,int endIndex,CountDownLatch latch){ this.arr=arr; this.startIndex=startIndex; this.endIndex=endIndex; this.latch=latch; } @Override public void run() { int sum=0; for(int i=startIndex;i<endIndex;i++){ sum+=arr[i]; } synchronized (MyThread.class) { total+=sum; } System.out.println(Thread.currentThread().getName()); latch.countDown(); } }}

對于CountDownLatch不熟悉的可以搜索下用法。

方式三:

通過java工具類 CyclicBarrier實現并發計算。

package test; import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier; public class FiveThreadCount1 { private int[] arr={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28}; private int total=0; public void test() throws InterruptedException, BrokenBarrierException{ int length=arr.length; CyclicBarrier barrier=new CyclicBarrier((length%5==0?5:6)+1); System.out.println(length); for(int j=0;j<length;j+=(length/5)){ MyThread task; if( (j+(length/5))<=length){ task=new MyThread(arr, j, j+(length/5), barrier); }else{ task=new MyThread(arr, j, length, barrier); } new Thread(task).start(); } barrier.await(); System.out.println(total); } private class MyThread implements Runnable{ int[] arr; int startIndex; int endIndex; CyclicBarrier barrier; public MyThread(int[] arr,int startIndex,int endIndex,CyclicBarrier barrier){ this.arr=arr; this.startIndex=startIndex; this.endIndex=endIndex; this.barrier=barrier; } @Override public void run() { int sum=0; for(int i=startIndex;i<endIndex;i++){ sum+=arr[i]; } synchronized (MyThread.class) { total+=sum; } try { System.out.println(Thread.currentThread().getName()); barrier.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}總結

總體來說,代碼二的方式二、三,效率會高一點。以上代碼都是通過main方法調用示例代碼的test方法,輸出結果到控制臺。

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

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人国产亚洲欧美成人综合网| 国产精品网站一区| 精品久久久久久久一区二区蜜臀| 日本成人在线电影网| 国产视频一区在线观看一区免费| 中文字幕一区二区三区乱码在线| 欧美一区三区二区在线观看| 精品国产区一区| 国产成人免费av在线| 欧美理论在线播放| 九九久久精品视频| 欧美性高清videossexo| 老司机精品视频线观看86| 久久久久久久久久久久久久一区| 亚洲第一激情av| 欧美亚洲专区| 五月开心婷婷久久| 亚洲欧美成人| 视频一区二区中文字幕| 91久久精品一区二区二区| 日本不卡1234视频| 欧洲激情一区二区| 国产综合一区二区| 51精品久久久久久久蜜臀| 国产福利一区在线| 日韩一区二区三区电影在线观看| 国产成人精品1024| 欧美精品一区二区三区在线| 91日韩精品一区| 欧美激情在线一区二区三区| 伊甸园精品99久久久久久| 亚洲精品乱码久久久久久黑人| 国产精品美女久久久浪潮软件| 洋洋av久久久久久久一区| 久久九九国产| 久久99久久精品| 日韩精品一区二区三区视频| 成人妖精视频yjsp地址| 国产日韩精品久久久| 1024精品一区二区三区| 亚洲h在线观看| 欧美午夜精品免费| 成人免费毛片aaaaa**| 中文字幕精品在线不卡| 亚洲深夜影院| 日本不卡视频在线| 日韩午夜在线播放| 欧美一区二区三区免费看| 国产精品久久久久久久蜜臀 | 亚洲第一二三四区| 欧美日韩精品三区| 93久久精品日日躁夜夜躁欧美| 国产精品蜜臀在线观看| 国产视频欧美| 国产精品一区专区| 中文字幕不卡在线观看| 久久xxxx精品视频| 国产自产2019最新不卡| 久久久国产精品麻豆| 最新亚洲激情| 日本美女一区二区| 欧美刺激脚交jootjob| 欧美性久久久| 欧美a级理论片| 精品国产3级a| 国产日韩欧美一区二区三区四区| 老汉av免费一区二区三区| 欧美电视剧免费观看| 国产综合色产| 琪琪久久久久日韩精品| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 欧美不卡在线视频| 狠久久av成人天堂| 久久精品国产亚洲a| 久久久久久久电影| 久久久久一区二区| av中文字幕在线不卡| 一区二区三区在线视频免费| 欧美日韩精品一区二区三区蜜桃| 91免费观看视频在线| 亚洲午夜av在线| 91麻豆精品国产自产在线观看一区| 欧美在线不卡| 青青草97国产精品免费观看| 国产日韩v精品一区二区| 玖玖玖国产精品| 91香蕉视频污| 丝袜a∨在线一区二区三区不卡| 欧美一级欧美一级在线播放| 亚洲久久成人| 国产精品影视在线| 亚洲精品第一国产综合野| 欧美挠脚心视频网站| 樱桃成人精品视频在线播放| 国内成人自拍视频| 亚洲精品成a人| 欧美电视剧在线看免费| 国产精品一区二区a| 成人污视频在线观看| 夜夜爽夜夜爽精品视频| 久久综合九色综合97婷婷女人| 欧美亚洲一区| aaa亚洲精品一二三区| 视频一区中文字幕| 中文字幕欧美日韩一区| 欧美三级电影在线看| 在线播放豆国产99亚洲| 国产suv精品一区二区883| 亚洲成人精品一区| 国产欧美日产一区| 欧美在线观看一二区| 一色屋精品视频在线观看网站| 韩国一区二区三区| 亚洲免费观看视频| 久久这里只有精品首页| 欧美亚洲免费在线一区| 影音先锋久久精品| 国产91精品一区二区麻豆网站| 亚洲成人精品在线观看| 国产精品久久久久一区二区三区共| 日韩一级大片在线观看| 色国产精品一区在线观看| 欧美成人一区二区在线| 韩国理伦片一区二区三区在线播放 | 欧美区亚洲区| 国产精品自拍毛片| 日日摸夜夜添夜夜添精品视频| 欧美国产综合色视频| 91麻豆精品国产91久久久资源速度 | 色哟哟国产精品免费观看| 国产精品xnxxcom| 国产成人av电影在线播放| 日本亚洲电影天堂| 亚洲一区二区三区在线播放| 国产精品毛片a∨一区二区三区| 欧美一区二区三区电影| 欧美日韩一区二区三区免费看| 亚洲一区二区三区欧美| 欧美日韩国产成人精品| 国产精品白丝jk黑袜喷水| 日本人妖一区二区| 亚洲午夜一区二区| 亚洲欧美色一区| 国产精品天天看| 久久奇米777| 日韩女优av电影在线观看| 欧美日韩国产一级二级| 玖玖玖国产精品| 免费亚洲一区| 国产日韩三区| 一区二区三区免费看| 亚洲香蕉网站| 欧美三区在线| 91视频91自| voyeur盗摄精品| 国产suv精品一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品亚洲不卡a| 亚洲激情国产| 黄色另类av| 欧美日韩蜜桃| 国产一区二区三区无遮挡 | 在线亚洲观看| 极品av少妇一区二区| 欧美国产视频在线观看| 95精品视频在线| caoporm超碰国产精品| 成人小视频免费在线观看| 丰满亚洲少妇av| 国产成人免费视频精品含羞草妖精| 国产一区二区三区黄视频| 国模一区二区三区白浆| 国内精品嫩模私拍在线| 韩日欧美一区二区三区| 精品一二线国产| 国产一区免费电影| 国产精品69毛片高清亚洲| 国产99精品视频| av中文一区二区三区| 99久久精品国产麻豆演员表| 91色|porny| 欧美日韩一区自拍| 国产一区二区三区四区老人| 亚洲精品免费观看| 久久精品综合| 精品视频一区三区九区| 欧美一区在线视频| 欧美精品一区二区三区蜜桃视频| 久久久久久免费| 国产精品不卡在线| 亚洲一区二区在线视频| 日韩不卡一区二区三区| 久久精品国产一区二区三| 国产精品资源在线| 成人福利视频在线看| 欧美另类亚洲| 中国成人亚色综合网站| 老牛影视一区二区三区| 欧美日韩一区 二区 三区 久久精品 | 午夜视频久久久|