/**
*
*/
/**
* @author bobwang
*
*/
package OrnamentalGarden;
import java.util.concurrent.*;
import java.util.*;
import java.lang.*;
/**
* Descriptsion:Class Count for counting the total pepole.
*/
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 getvalue() {
return count;
}
}
/**
* Decription:Class Entrance for counting the people that enters this entrance.
*/
class Entrance implements Runnable {
//attribute area
private static Count count = new Count();
private static List entrances = new ArrayList();
private int number = 0;
private int id;
private static volatile boolean canceled = false;
//static method area
public static void cancel() {
canceled = true;
}
public static int getTotalCount() {
return count.getvalue();
}
public static int sumEntrances() {
int sum =0;
for(Entrance e : entrances){
sum +=e.getValue();
}
return sum;
}
//Contructor area
public Entrance (int id) {
this.id = id;
entrances.add(this);
}
//Method area
public synchronized int getValue(){
return number;
}
public String toString(){
return "Entrance"+ id+":"+getValue();
}
//Override from interface Runnable
public void run() {
while(!canceled)
{
synchronized(this)
{
number++;
}
System.out.println(this+"Total:"+count.increment());
try {
TimeUnit.MICROSECONDS.sleep(100);
}
catch(InterruptedException e) {
System.out.println("sleep Interrupted");
}
}
System.out.println("Stopping"+this);
}
}
public class OrnamentalGarden {
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i<5;i++)
{
exec.execute(new Entrance(i));
}
TimeUnit.MILLISECONDS.sleep(20);
Entrance.cancel();
exec.shutdown();
if(!exec.awaitTermination(250, TimeUnit.MILLISECONDS))
{
System.out.println("Some task was not closed.");
}
System.out.println("Total:"+Entrance.getTotalCount());
System.out.println("Total:"+Entrance.sumEntrances());
}
}