package test.btrace;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import java.awt.Component;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
* 33.* A BTrace program that can be run against a GUI 34.* program. This
* program prints (monotonic) count of 35.* number of java.awt.Components
* created once every 36.* 2 seconds (2000 milliseconds). 37.
*/
@BTrace
public class NewComponent {
// component count
private static volatile long count;
@OnMethod(clazz = "java.awt.Component", method = "<init>", location = @Location(Kind.RETURN))
public static void onnew(@Self Component c) {
// increment counter on constructor entry
count++;
}
@OnTimer(2000)
public static void print() {
// print the counter
println(Strings.strcat("component count = ", str(count)));
}
public static class Task implements Runnable {
private Semaphore sem = new Semaphore(0);
private String name;
private int printCount;
private Semaphore nextSem;
/**
* @param name
*/
public Task(String name, int printCount, Semaphore nextSem) {
this.name = name;
this.printCount = printCount;
this.nextSem = nextSem;
}
public Semaphore getSem() {
return sem;
}
public void setSem(Semaphore sem) {
this.sem = sem;
}
public void run() {
for(int i = 0;i < printCount;i++)
{
try {
sem.acquire();
} catch (InterruptedException e) {
}
System.out.println(name);
if(nextSem != null)
nextSem.release();
}
}
};
public static void main(String[] args) throws Exception
{
Semaphore sem = new Semaphore(0);
Task c = new Task("C", 10, sem);
Task b = new Task("B", 10, c.getSem());
Task a = new Task("A", 10, b.getSem());
Semaphore startSem = a.getSem();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(c);
exec.execute(b);
exec.execute(a);
for(int i = 0;i< 10;i++)
{
startSem.release();
sem.acquire();
}
// exec.awaitTermination(1000000, TimeUnit.SECONDS);
exec.shutdown();
}
}