先写两个多线程的小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();//这就是最终的结果
}
}
这样写代码着实不方便。