场景:
公园的管理人员希望知道每天通过多个大门进入公园的总人数,这样为每个门设置一个计数器,总人数也就是各个计数器的和,代码如下所示:
计数器类
public class Count { private int count=0; private Random rand=new Random(47);
public synchronized int increment(){ int temp=count; if(rand.nextBoolean()) Thread.yield(); return (count=++temp); }
public synchronized int value(){ return count; }
}
=====================Entrance public class Entrance implements Runnable{ private static Count count=new Count();
private static List<Entrance> entrances=new ArrayList<Entrance>();
private int sum=0;
private final int id;
private static volatile boolean canceled=false;
public static void cancel(){ canceled=true; }
public Entrance(int id) { // TODO Auto-generated constructor stub this.id=id; entrances.add(this); }
@Override public void run() { // TODO Auto-generated method stub while(!canceled){ synchronized(this){ ++sum; }
System.out.println(this+" Total:"+count.increment()); try { TimeUnit.MILLISECONDS.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("sleep interrupted..."); }
}
System.out.println("Stopping:"+this); }
public synchronized int getValue(){ return sum; }
@Override public String toString() { // TODO Auto-generated method stub return "Entrance "+id+":"+getValue(); }
public static int getTotalCount(){ return count.value(); }
public static int sumEntrances(){ int sum=0; for(Entrance entrance:entrances){ sum+=entrance.getValue();
} return sum; } }
===========================公园管理人员查看这几个门的进入人数
public class Garden {
public static void main(String[] args) throws InterruptedException{ ExecutorService exec=Executors.newCachedThreadPool(); for(int i=0;i<5;i++) //这里面有5个入口 exec.execute(new Entrance(i));//启动线程计数人数 try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Entrance.cancel();//各个任务共享的变量终止 exec.shutdown(); if(!exec.awaitTermination(250,TimeUnit.MILLISECONDS )); System.out.println("some tasks was not terminated!"); System.out.println("total:"+Entrance.getTotalCount()); System.out.println("sum of entrances :"+Entrance.sumEntrances());
} }
|