java多线程计算和

如题:如何利用多线程实现1~1000000000的和

本文利用Callable可以返回值的特性,并将执行结果用CompletionService进行存储,最后将分步值累加。

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 SumByCallable {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        int n = 10;//线程数
        long start=1L;//开始值
        long end=1000000000L;//结束值
        long sum = 0L;
        ExecutorService threads = Executors.newFixedThreadPool(n);
        CompletionService<Long> cs = new ExecutorCompletionService<Long>(threads);
        for(int i=0;i<n;i++){
            cs.submit(new SumCallable(start, end, n, i));
        }
        threads.shutdown();//关闭service
        for(int i=0;i<n;i++){
            try {
                sum += cs.take().get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("和:"+sum+",耗时:"+(endTime-startTime)+"ms");
    }

}
class SumCallable implements Callable<Long>{
    private long start;
    private long end;
    public SumCallable(long start, long end, int n, int index){
        this.start = index * (end-start)/n;
        this.end = (index+1) * (end-start)/n-1;
        if(index==0){
            this.start = start;
        }
        if(index == n-1){
            this.end = end;
        }
    }

    @Override
    public Long call() throws Exception {
        long sum = 0;
        for(long i=start;i<=end;i++){
            sum +=i;
        }
    //    System.out.println(Thread.currentThread().getName()+":"+sum);
        return sum;
    }
    
}

执行结果:

和:500000000500000000,耗时:677ms

效率还是蛮高的O(∩_∩)O哈哈~

posted @ 2017-03-31 17:33  芭蕉扇  阅读(3855)  评论(0编辑  收藏  举报