複数のタスクの実行終了およびリソース共有の例
シーン:
公園の管理者は毎日複数のゲートを通って公園に入る総人数を知りたいと思っています.このようにドアごとにカウンタを設置します.総人数は各カウンタの和で、コードは以下の通りです.
カウンタクラス
===========================================================================
公園の管理者は毎日複数のゲートを通って公園に入る総人数を知りたいと思っています.このようにドアごとにカウンタを設置します.総人数は各カウンタの和で、コードは以下の通りです.
カウンタクラス
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 entrances=new ArrayList();
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());
}
}