如題:如何利用多線程實現1~1000000000的和java
本文利用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; } }
執行結果:ide
和:500000000500000000,耗時:677msthis
效率仍是蠻高的O(∩_∩)O哈哈~spa