CountDownLatch 计数位0仍然阻塞

younerest 2013-01-18 10:19:46
照书上敲的一个例子,看不出哪里有问题,请教高手:
下面程序是用CountDownLatch来协调子线程的,但程序运行到begin.wait();的时候,一直处于阻塞状态,想了很久,还找不出原因。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class Runner implements Callable<Integer>{
private CountDownLatch begin;
private CountDownLatch end;
public Runner(CountDownLatch begin,CountDownLatch end)
{
this.begin=begin;
this.end=end;
}
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int score=new Random().nextInt(25);
begin.wait();
TimeUnit.MILLISECONDS.sleep(score);
end.countDown();
return score;
}
public static void main(String[]args) throws InterruptedException, ExecutionException
{

int num=10;
CountDownLatch begin=new CountDownLatch(1);
CountDownLatch end=new CountDownLatch(num);
ExecutorService es=Executors.newFixedThreadPool(num);
List<Future<Integer>>futures=new ArrayList<Future<Integer>>();
for(int i=0;i<num;i++)
{
futures.add(es.submit(new Runner(begin,end)));
}
begin.countDown();
System.out.println("ffffffffffffffff");
end.await();
int count=0;
for(Future<Integer>f:futures){
count+=f.get();
}
System.out.println("平均分数为:"+count/num);
}
}
...全文
338 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
s1s23jiazx 2013-01-19
  • 打赏
  • 举报
回复
younerest 2013-01-19
  • 打赏
  • 举报
回复
代码有个地方写错了 import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; public class Runner implements Callable<Integer>{ private CountDownLatch begin; private CountDownLatch end; public Runner(CountDownLatch begin,CountDownLatch end) { this.begin=begin; this.end=end; } @Override public Integer call() throws Exception { // TODO Auto-generated method stub int score=new Random().nextInt(25); begin.await(); TimeUnit.MILLISECONDS.sleep(score); end.countDown(); return score; } public static void main(String[]args) throws InterruptedException, ExecutionException { int num=10; CountDownLatch begin=new CountDownLatch(1); CountDownLatch end=new CountDownLatch(num); ExecutorService es=Executors.newFixedThreadPool(num); List<Future<Integer>>futures=new ArrayList<Future<Integer>>(); for(int i=0;i<num;i++) { futures.add(es.submit(new Runner(begin,end))); } begin.countDown(); System.out.println("ffffffffffffffff"); end.await(); int count=0; for(Future<Integer>f:futures){ count+=f.get(); } System.out.println("平均分数为:"+count/num); } }
younerest 2013-01-19
  • 打赏
  • 举报
回复

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧