多线程

   

         先写两个多线程的小demo,可能以后会用到:

分别是JDK1.5里的ExcutorSerice与JDK1.7里的ForkJoinPool

一,JDK1.5里的ExcutorService

摘于 ’JAVA虚拟机并发编程’里的一段代码:

public double computeNetAssetValue(final Map<String,Integer> stocks){
   
     final int numberOCores = Runtime.getRuntime().availableRrocessors();
     final double blockingCoefficient = 0.9;
     final int poolSize = (int)(numberOfCores / (1 - blockingCoefficient));

     final List<Callable<Double>> partitions = new ArrayList<Callable<Double>>();
     
     for(final String ticker : stocks.keySet()) {
        partitions.add(new Callable<Double>() {
           public Double call() throws Exception{
                return stocks.get(ticker) * YahooFinalce.getPrice(ticker);         
         }
    });
  }

     final ExecutorService executorPool = Executors.newFixedThreadPool(poolSize);
     final List<Future<Double>> valuesOfStocks = executorPool.invokeAll(partitions,10000,TimeUnit.SECONDS);
     double netAssetValue = 0.0;
     for(final Future<Double> valueOfAStock : valueOfStocks){
          netAssetValue += valueOfAStock.get();
    }
     executorPool.shutdown();
     return netAssetValue;
 }
使用到了环境的内核数、固定线程池,还有子线程完成任务后返回的值


二,JDK1.7里的ForkJoinPool

这个例子是基于‘疯狂JAVA讲义’


class CalTask extends RecursiveTask<Integer>{
  
    private static final int THRESHOLD = 20;
    private int arr[];
    private int start;
    private int end;

    public CalTask(int[] arr,int start,int end){
         this.arr = arr;
         this.start = start;
         this.end = end; 
    }

    @Override
    protected Integer compute(){
       int sum = 0;
       if(end - start < THRESHOLD){
          for(int i=start;i<end;i++){
             sum += arr[i];
        }
          return sum;
     }else{
           int middle = (start + end) /2;  //拆成两个任务
           CalTask left = new CalTask(arr,start,middle);
           CalTask right = new CalTask(arr,middle,end);
           //并行执行两个任务
           left.fork();
           right.fork();
          return left.join() + right.join();//将两个任务的结果累加
     }
   }
      public static void main(String[] args){
          //下面有简写了
         ForkJoinPool  pool = new ForkJoinPool();
         Future<Integer> future = pool.submit(new CalTask(arr,0,arr.length);
         int result = future.get();//这就是最终的结果
    }  
}


这样写代码着实不方便。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值