最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用5個線程計算數(shù)組之和

 更新時間:2021年05月20日 11:00:02   作者:安迪爸爸  
本文主要介紹了Java使用5個線程計算數(shù)組之和,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

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

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

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

代碼一:

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

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);
 }
 //方法一的線程池實現(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)版
 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)是為了讓其他線程有時間執(zhí)行任務,如果不sleep的話,有可能一個線程就全部執(zhí)行完了。 最后的sleep(10000)是為了等所有線程執(zhí)行完后,打印最后的計算結果。 

代碼二:

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

方式一:

使用Callable,F(xiàn)utureTask方式,來實現(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;
  }
 }
 
}

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

方式二:

通過java工具類CountDownLatch實現(xiàn)并發(fā)計算

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實現(xiàn)并發(fā)計算。

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個線程計算數(shù)組之和的文章就介紹到這了,更多相關Java 線程數(shù)組之和內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)域名解析的示例詳解(附帶源碼)

    Java實現(xiàn)域名解析的示例詳解(附帶源碼)

    這篇文章將從理論到實踐和從代碼到測試,全方位地講解如何利用?Java?實現(xiàn)一個簡單的域名解析器,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-03-03
  • 關于@MapperScan包掃描的坑及解決

    關于@MapperScan包掃描的坑及解決

    這篇文章主要介紹了關于@MapperScan包掃描的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • tk-mybatis整合springBoot使用兩個數(shù)據源的方法

    tk-mybatis整合springBoot使用兩個數(shù)據源的方法

    單純的使用mybaits進行多數(shù)據配置網上資料很多,但是關于tk-mybaits多數(shù)據源配置沒有相關材料,本文就詳細的介紹一下如何使用,感興趣的可以了解一下
    2021-12-12
  • Java 給PDF簽名時添加可信時間戳的方法

    Java 給PDF簽名時添加可信時間戳的方法

    這篇文章主要介紹了Java 給PDF簽名時添加可信時間戳,關于jar導入的問題,本文給大家?guī)韮煞N方法,一種是手動導入另一種是maven配置導入,需要的朋友可以參考下
    2021-07-07
  • 如何將Java枚舉名稱作為注解的屬性值實現(xiàn)詳解

    如何將Java枚舉名稱作為注解的屬性值實現(xiàn)詳解

    這篇文章主要為大家介紹了如何將Java枚舉名稱作為注解的屬性值實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Spring?Cloud?Hystrix原理與注意事項小結

    Spring?Cloud?Hystrix原理與注意事項小結

    本文介紹了Hystrix的基本概念、工作原理以及其在實際開發(fā)中的應用方式,通過對Hystrix的深入學習,開發(fā)者可以在分布式系統(tǒng)中實現(xiàn)精細的錯誤處理機制,并能夠及時響應系統(tǒng)中的異常,避免服務的連鎖崩潰,感興趣的朋友一起看看吧
    2025-03-03
  • eclipse的git插件安裝、配置與使用詳解

    eclipse的git插件安裝、配置與使用詳解

    這篇文章主要介紹了eclipse的git插件安裝、配置與使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Springboot 整合 Dubbo/ZooKeeper 實現(xiàn) SOA 案例解析

    Springboot 整合 Dubbo/ZooKeeper 實現(xiàn) SOA 案例解析

    這篇文章主要介紹了Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例,需要的朋友可以參考下
    2017-11-11
  • java實現(xiàn)MD5加密算法的實例代碼

    java實現(xiàn)MD5加密算法的實例代碼

    這篇文章主要介紹了java實現(xiàn)MD5加密算法的實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • Java圖形界面Swing原理及用法解析

    Java圖形界面Swing原理及用法解析

    這篇文章主要介紹了Java圖形界面Swing原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10

最新評論

疏附县| 双牌县| 平江县| 延津县| 治多县| 兴文县| 平山县| 莱西市| 四会市| 马边| 吉林市| 潮安县| 翼城县| 岳西县| 册亨县| 冕宁县| 申扎县| 错那县| 时尚| 棋牌| 日照市| 连州市| 内黄县| 阜南县| 新干县| 太白县| 湟源县| 伊川县| 伊金霍洛旗| 金山区| 榆中县| 前郭尔| 永寿县| 昆山市| 华亭县| 吉安县| 城固县| 同江市| 双流县| 冀州市| 新余市|