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

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

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

前言

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

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

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

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

代碼一:

五個(gè)線程交替累加計(jì)算數(shù)組之和,這種方法其實(shí)不如單線程直接累加快,因?yàn)榻惶胬奂有枰耙粋€(gè)線程計(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);
 }
 //方法一的線程池實(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);
 }
 //方法二的線程池實(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)是為了讓其他線程有時(shí)間執(zhí)行任務(wù),如果不sleep的話,有可能一個(gè)線程就全部執(zhí)行完了。 最后的sleep(10000)是為了等所有線程執(zhí)行完后,打印最后的計(jì)算結(jié)果。 

代碼二:

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

方式一:

使用Callable,F(xiàn)utureTask方式,來實(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è)線程異步執(zhí)行,其實(shí)是順序執(zhí)行,因?yàn)?nbsp;task.get是要等待線程執(zhí)行完畢才會(huì)執(zhí)行下邊的代碼。所以效率不會(huì)高,可能換種寫法可以解決這個(gè)問題,這里就不深入研究。

方式二:

通過java工具類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();
 
  }
  
 }
}

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

方式三:

通過java工具類 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é)

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

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

相關(guān)文章

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

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

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

    關(guān)于@MapperScan包掃描的坑及解決

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

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

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

    Java 給PDF簽名時(shí)添加可信時(shí)間戳的方法

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

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

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

    Spring?Cloud?Hystrix原理與注意事項(xiàng)小結(jié)

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

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

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

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

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

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

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

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

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

最新評論

沂源县| 剑河县| 富蕴县| 余干县| 庆阳市| 军事| 呼伦贝尔市| 余干县| 荣成市| 贵南县| 三穗县| 调兵山市| 蒙城县| 防城港市| 山东| 九龙城区| 门源| 襄樊市| 温宿县| 兴国县| 宁明县| 葵青区| 贵德县| 白水县| 定边县| 古浪县| 樟树市| 嘉善县| 漠河县| 同仁县| 会东县| 阳信县| 股票| 平定县| 新田县| 井陉县| 常熟市| 宝清县| 萝北县| 吉木萨尔县| 奉节县|