62,621
社区成员
发帖
与我相关
我的任务
分享package houlei.util.concurrent;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 用于多线程求纯整数List之和的类。未进行异常处理。
* <p>
* 该类创建于 2009-6-29 上午10:04:49
* @version 1.0.0
* @author 侯磊
*/
public class SumCounter {
private List<Integer> list ;
private int totalThreads ;
private CyclicBarrier barrier ;
private long sum;
public SumCounter(List<Integer> list, int totalThreads) {
super();
this.list = list;
this.totalThreads = totalThreads;
barrier = new CyclicBarrier(totalThreads+1);
}
public long doSum(){
ExecutorService exec = Executors.newFixedThreadPool(totalThreads);
for(int i=0;i<totalThreads;i++){
int len = list.size()/totalThreads;
exec.submit(new SumSubTask(list, i*len, i*len>=list.size()?list.size():len));
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
exec.shutdown();
return sum;
}
class SumSubTask implements Runnable{
private List<Integer> list ;
private int offset;
private int len;
public SumSubTask(List<Integer> list, int offset, int len) {
super();
this.list = list;
this.offset = offset;
this.len = len;
}
public void run() {
long subSum = 0L;
ListIterator<Integer> itr = list.listIterator(offset);
for(int i=0;itr.hasNext()&&i<len;i++){
subSum +=itr.next();
}
synchronized (SumCounter.this) {
sum+=subSum;
}
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+"\tSubSum:"+subSum);
}
}
}
package houlei.util.concurrent;
import java.util.LinkedList;
import java.util.List;
/**
* 用于多线程求纯整数List之和的测试代码入口。
* <p>
* 该类创建于 2009-6-29 上午10:03:52
* @version 1.0.0
* @author 侯磊
*/
public class Main {
public static void main(String[] args) {
List<Integer> list = getTheList();
int totalThreads = 5;
SumCounter sc = new SumCounter(list,totalThreads);
long sum = sc.doSum();
System.out.println(sum);
}
private static List<Integer> getTheList() {
List<Integer> list = new LinkedList<Integer>();
for(int i=1;i<=10000;i++){
list.add(i);
}
return list;
}
}