国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java使用5個(gè)線(xiàn)程計(jì)算數(shù)組之和

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

之前寫(xiě)過(guò)多線(xiàn)程累加計(jì)數(shù),原理跟本篇類(lèi)似,傳送門(mén)

累加計(jì)數(shù)比計(jì)算數(shù)組之和邏輯稍微簡(jiǎn)單一點(diǎn),如果對(duì)于這塊不熟悉的,可以先看下累加計(jì)數(shù)。

基本思想已經(jīng)在之前那篇文章里寫(xiě)過(guò)了,這里就直接貼代碼了。

這里分別通過(guò)自己創(chuàng)建線(xiàn)程來(lái)實(shí)現(xiàn)功能,還有通過(guò)線(xiàn)程池來(lái)實(shí)現(xiàn)功能。思想都差不多。只是代碼寫(xiě)法略有不同。僅供參考。

代碼一:

五個(gè)線(xiàn)程交替累加計(jì)算數(shù)組之和,這種方法其實(shí)不如單線(xiàn)程直接累加快,因?yàn)榻惶胬奂有枰耙粋€(gè)線(xiàn)程計(jì)算的結(jié)果。

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; //定義一個(gè)任務(wù),關(guān)鍵點(diǎn)所在 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); } //方法一的線(xiàn)程池實(shí)現(xiàn)版 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); } //方法二的線(xiàn)程池實(shí)現(xiàn)版 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)是為了讓其他線(xiàn)程有時(shí)間執(zhí)行任務(wù),如果不sleep的話(huà),有可能一個(gè)線(xiàn)程就全部執(zhí)行完了。 最后的sleep(10000)是為了等所有線(xiàn)程執(zhí)行完后,打印最后的計(jì)算結(jié)果。

代碼二:

將數(shù)組分為5等分,讓每個(gè)線(xiàn)程計(jì)算自己負(fù)責(zé)的那份,并發(fā)計(jì)算,最后匯總結(jié)果。這種方式比代碼一速度會(huì)快些。因?yàn)榫€(xiàn)程獨(dú)立計(jì)算,不依賴(lài)其他線(xiàn)程的結(jié)果。最后幾個(gè)線(xiàn)程將總數(shù)累加即可。

方式一:

使用Callable,F(xiàn)utureTask方式,來(lái)實(shí)現(xiàn)代碼:

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; } } }

這個(gè)方式有一個(gè)缺點(diǎn),看似5個(gè)線(xiàn)程異步執(zhí)行,其實(shí)是順序執(zhí)行,因?yàn)?task.get是要等待線(xiàn)程執(zhí)行完畢才會(huì)執(zhí)行下邊的代碼。所以效率不會(huì)高,可能換種寫(xiě)法可以解決這個(gè)問(wèn)題,這里就不深入研究。

方式二:

通過(guò)java工具類(lèi)CountDownLatch實(shí)現(xiàn)并發(fā)計(jì)算

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(); } }}

對(duì)于CountDownLatch不熟悉的可以搜索下用法。

方式三:

通過(guò)java工具類(lèi) CyclicBarrier實(shí)現(xiàn)并發(fā)計(jì)算。

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(); } } }}總結(jié)

總體來(lái)說(shuō),代碼二的方式二、三,效率會(huì)高一點(diǎn)。以上代碼都是通過(guò)main方法調(diào)用示例代碼的test方法,輸出結(jié)果到控制臺(tái)。

到此這篇關(guān)于Java使用5個(gè)線(xiàn)程計(jì)算數(shù)組之和的文章就介紹到這了,更多相關(guān)Java 線(xiàn)程數(shù)組之和內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 久久综合精品国产一区二区三区无 | 亚洲精品一区国产二区 | 欧美日韩免费播放一区二区 | 亚洲网在线观看 | 无遮挡一级毛片私人影院 | 2021国产精品系列一区二区 | 久久亚洲成人 | 免费看一级欧美毛片 | 最近日本免费观看视频 | 91手机看片国产福利精品 | 国产uv1区二区三区 国产va免费精品高清在线观看 | 日本欧美一区二区三区片 | 欧美日韩亚洲综合久久久 | 自拍偷拍亚洲区 | 天天狠操| 国产一区亚洲二区三区毛片 | 免费又黄又爽又猛大片午夜 | 在线观看亚洲成人 | 国产精品夜色视频一区二区 | 日本在线加勒比 | 国产黄色网 | 亚洲图片一区二区 | 精品免费久久久久久成人影院 | 久久一本色系列综合色 | 免费的一级片网站 | 一级做a爰片久久毛片潮喷 一级做a爰片久久毛片美女 | 欧美透逼 | 91年精品国产福利线观看久久 | 国产91丝袜美腿在线观看 | 亚洲国产精品线观看不卡 | 欧美日韩一区二区三区四区在线观看 | 亚洲欧美国产18 | 国产精品资源手机在线播放 | 97久久天天综合色天天综合色 | 一本大道香蕉大vr在线吗视频 | 国内精品久久久久影院网站 | 国产一级特黄aaa大片 | 成人国产三级在线播放 | 国内精品久久影院 | 精品久久久久不卡无毒 | 国产欧美一区二区三区免费 |