天天看點

java多線程分發問題——多線程求和

最近讀了<java程式設計思想>的分發部分,又碰到一個網友想利用多線程求和并且彙總求最後結果,具體要求是這樣的“寫十個線程,第一個線程求1到10的和,第二個11到20的和,第三個求21到30的和...第10個求91到100的和,求十個線程的和”。可以利用CyclicBarrier将分發後的任務彙總,将所有的線程去執行,執行結果後調用顯示最後的結果線程。下面寫了一段代碼可以參考一下。

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.CyclicBarrier;

public class CounterThread extends Thread{

private int start;

private int end;

private CyclicBarrier barrier ;

public CounterThread(int id,int start, int end,CyclicBarrier barrier) {

this.start = start;

this.end = end;

this.barrier = barrier;

setName("Thread-"+id+" ");

}

@Override

public void run() {

int count = 0;

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

count += i;

}

Counter.totalCount(count);

try {

barrier.await();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

}

}

import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class CounterTest {

public static void main(String[] args) {

//CyclicBarrier指定了當10個線程運作結束時候,可以進行最後結果展示了

CyclicBarrier barrier = new CyclicBarrier(10,new TotalTask(new Counter()));

ExecutorService executorService = Executors.newCachedThreadPool();

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

int start = i*10+1;

int end = start + 9;

CounterThread counterThread = new CounterThread(i,start, end,barrier);

executorService.execute(counterThread);

}

executorService.shutdown();

}

}

class Counter {

private static int count =0;

public synchronized static int totalCount(int perCount){

count += perCount;

return count;

}

public int totalResult(){

return count;

}

}

class TotalTask implements Runnable{

private Counter counter ;

public TotalTask(Counter counter){

this.counter = counter;

}

@Override

public void run() {

System.out.println("所有線程運作完畢,總結果為:");

int total = counter.totalResult();

System.out.println(total);

}

}