日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:165日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人午夜在线| 久久亚洲图片| 国产精品一区二区av交换| 日韩av网站在线免费观看| 亚洲+小说+欧美+激情+另类| 亚洲欧洲国产精品一区| 免费在线观看视频一区| 在线观看一区| 亚洲精品麻豆| 日韩av一二三| 久久不卡日韩美女| 久久精品国产网站| 精品视频一区二区三区在线观看| 黄色精品视频| 人人草在线视频| 99久精品视频在线观看视频| 日韩精品中文字幕第1页| 久久视频一区| 99国产精品自拍| 日韩综合小视频| 日韩不卡免费视频| 九九九精品视频| 天堂网av成人| 三级欧美韩日大片在线看| 日韩精品亚洲专区在线观看| 国产精品视频首页| 日韩大片在线| 欧美jjzz| 亚州精品视频| 美女精品久久| 91精品一区二区三区综合在线爱| 久久精品导航| 亚洲精品国产精品粉嫩| 久久婷婷国产| 韩日一区二区三区| 亚洲精品在线国产| 麻豆国产91在线播放| 久久精品亚洲人成影院| 中文视频一区| 久久久久久亚洲精品美女| 久久国产毛片| 日本免费新一区视频| zzzwww在线看片免费| 日韩在线观看一区二区| 国产伊人久久| 亚洲青青久久| 精品一区二区三区在线观看视频 | 手机精品视频在线观看| 国产欧美日韩亚洲一区二区三区| 国产v日韩v欧美v| 蜜桃av一区二区| 国产aa精品| 免费看日韩精品| 精品高清久久| 亚洲欧美不卡| 国产一区2区| 蜜臀久久久99精品久久久久久| 欧美久久一区二区三区| 亚洲午夜精品久久久久久app| 日韩av午夜在线观看| 99久久www免费| 国产精品伦一区二区| 亚洲综合精品四区| 福利一区二区| 日韩高清在线观看一区二区| 五月激情久久| 久久国产欧美日韩精品| 在线亚洲观看| 中文在线а√在线8| 亚洲三级网站| 欧美日韩精品免费观看视欧美高清免费大片 | 久久精品国产99| 亚洲香蕉久久| 视频一区中文| 国产h片在线观看| 国产乱人伦丫前精品视频 | 欧美特黄a级高清免费大片a级| 免费精品一区| 欧美有码在线| 日韩在线一二三区| 国产真实久久| 国产精品18| 亚洲免费专区| 精品欧美久久| 日韩大片在线播放| 国产精品a久久久久| 中文在线日韩| 尤物网精品视频| 亲子伦视频一区二区三区| 精品一区二区三区的国产在线观看| 亚洲ww精品| 三级在线观看一区二区| 免费视频国产一区| 欧美男人天堂| 久久亚洲人体| 91亚洲无吗| 久久xxxx精品视频| 99久久久久| 亚洲精品88| 成人精品视频| 国产成人精品免费视| 精品网站aaa| 欧美黄色精品| 久久国产人妖系列| 日韩av中文字幕一区二区| 蜜芽一区二区三区| 日韩在线卡一卡二| 久久福利一区| 免费成人在线影院| 亚洲综合精品| 美女黄网久久| av亚洲免费| 欧美日韩国产亚洲一区| 亚洲国产成人精品女人| 国产字幕视频一区二区| 欧美亚洲国产一区| 欧美粗暴jizz性欧美20| 欧美日韩国产免费观看视频| 免费不卡中文字幕在线| 伊人精品在线| 性色一区二区| 蜜桃一区二区三区在线| 亚洲精品字幕| 91精品麻豆| 久久的色偷偷| 正在播放日韩精品| 不卡一二三区| 久久激情婷婷| 99精品99| 婷婷综合一区| 国产精品亚洲一区二区在线观看| 你懂的国产精品永久在线| 美女视频网站久久| 91亚洲国产| 久久婷婷亚洲| 模特精品在线| 日本a口亚洲| 久久精品国产在热久久| 理论片午夜视频在线观看| 999久久久91| 亚洲欧美日本视频在线观看| 免费人成黄页网站在线一区二区| 亚洲精品一级| 久久三级中文| 久久精品国产www456c0m| 老牛国产精品一区的观看方式| 热久久国产精品| 欧美日韩1区2区3区| 风间由美中文字幕在线看视频国产欧美 | 在线精品国产亚洲| 国产精品午夜一区二区三区| 精品免费在线| 久久九九精品| 免费不卡在线观看| 日本免费新一区视频| 国产精品porn| 久久精品国内一区二区三区水蜜桃| 在线视频亚洲| 国产美女亚洲精品7777| 精品日韩视频| 亚洲久久视频| 精品国产网站| 亚洲高清影视| 国产日韩免费| 91精品婷婷色在线观看| 在线精品亚洲| 精品入口麻豆88视频| 亚洲欧洲一区| 国产精品毛片久久久| 日韩三区在线| 亚洲精品亚洲人成在线观看| 国产999精品在线观看| 麻豆精品91| 精品三级av在线导航| 国产精品日韩| 精品久久影院| 视频一区免费在线观看| 精品一区二区三区的国产在线观看| 午夜视频精品| 久久亚洲资源中文字| 亚洲欧美视频| 97国产精品| 日韩成人一级| 国产综合精品一区| 国产麻豆一区二区三区精品视频| 色老板在线视频一区二区| 日韩精品中文字幕一区二区| 新版的欧美在线视频| 日本综合精品一区| 99tv成人| 美日韩一区二区三区| 国产免费成人| 高清一区二区| 日韩av中文字幕一区| 午夜国产欧美理论在线播放| 国精品产品一区| 奇米777国产一区国产二区| 婷婷激情综合| 激情综合婷婷| 91亚洲无吗|