并发编程框架

package executorservice;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

 public class ConcurrentCalculator2 { 

     private ExecutorService exec; 

     private CompletionService<Long> completionService; 


     private int cpuCoreNumber; 

     // ... 

     class SumCalculator implements Callable<Long> { 

         private int[] numbers; 

         private int start; 

         private int end; 

   

         public SumCalculator(final int[] numbers, int start, int end) { 

             this.numbers = numbers; 

             this.start = start; 

             this.end = end; 

         } 

   

         public Long call() throws Exception { 

             Long sum = 0l; 

             for (int i = start; i < end; i++) { 

                 sum += numbers[i]; 

             } 

             return sum; 

         } 

     } 

   

     public ConcurrentCalculator2() { 

         cpuCoreNumber = Runtime.getRuntime().availableProcessors(); 

         exec = Executors.newFixedThreadPool(cpuCoreNumber); 

         completionService = new ExecutorCompletionService<Long>(exec); 

     } 

   

     public Long sum(final int[] numbers) { 

         // ..CPU...........FutureTask....Executor 

         for (int i = 0; i < cpuCoreNumber; i++) { 

             int increment = numbers.length / cpuCoreNumber + 1; 

             int start = increment * i; 

             int end = increment * i + increment; 

             if (end > numbers.length) 

                 end = numbers.length; 

             SumCalculator subCalc = new SumCalculator(numbers, start, end);  

             if (!exec.isShutdown()) { 

                 completionService.submit(subCalc); 

             } 

         } 

         return getResult(); 

     } 

   

     /** 

      * .................. 

      *  

      * @return 

      */

     public Long getResult() { 

         Long result = 0l; 

         for (int i = 0; i < cpuCoreNumber; i++) {             

             try { 

                 Long subSum = completionService.take().get(); 

                 result += subSum;            

             } catch (InterruptedException e) { 

                 e.printStackTrace(); 

             } catch (ExecutionException e) { 

                 e.printStackTrace(); 

             } 

         } 

         return result; 

     } 

   

     public void close() { 

         exec.shutdown(); 

     } 
     public static void main(String[] args)
     {
         int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 10, 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; 

         ConcurrentCalculator2 calc = new ConcurrentCalculator2(); 

         Long sum = calc.sum(numbers); 

         System.out.println(sum); 

         calc.close();
     }
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值