Index: src/benchmark/Makefile.am
===================================================================
--- src/benchmark/Makefile.am	(revision a6d70cd9cc78ffe8eb41df9c2337dc00e0e31f6e)
+++ src/benchmark/Makefile.am	(revision 56de6b39ab5b9030703f9b3fc0e81e14b65f2e89)
@@ -165,5 +165,6 @@
 	signal-cfa1.run		\
 	signal-cfa2.run		\
-	signal-cfa4.run
+	signal-cfa4.run		\
+	signal-java_thread.run
 
 signal-upp$(EXEEXT):
Index: src/benchmark/schedint/JavaThread.java
===================================================================
--- src/benchmark/schedint/JavaThread.java	(revision a6d70cd9cc78ffe8eb41df9c2337dc00e0e31f6e)
+++ src/benchmark/schedint/JavaThread.java	(revision 56de6b39ab5b9030703f9b3fc0e81e14b65f2e89)
@@ -1,42 +1,40 @@
-import java.util.concurrent.atomic.AtomicBoolean;
+class Monitor {
+	public static volatile Boolean go = false;
+}
 
-public class JavaThread {
-	public synchronized void doWait  () throws InterruptedException { this.wait  (); }
-	public synchronized void doSignal() throws InterruptedException { this.notify(); }
+class Signaller extends Thread {
+	Monitor m;
+	Signaller(Monitor m) {
+		this.m = m;
+	}
 
-	public static AtomicBoolean go = new AtomicBoolean( false );
-
-	public static class Signaller extends Thread {
-		JavaThread j;
-		Signaller(JavaThread j) {
-			this.j = j;
-		}
-
-		public void run() {
-			go.set( true );
-			try {
-				while( JavaThread.go.get() ) {
-					this.j.doSignal();
-				}
-			} catch(InterruptedException trash) {
-
+	public void run() {
+		Monitor.go = true;
+		while( Monitor.go ) {
+			synchronized(this.m) {
+				this.m.notify();
 			}
 		}
 	}
+}
 
+public class JavaThread {
 	public static void main(String[] args) throws InterruptedException {
 		int NoOfTimes = 50000;
-		JavaThread j = new JavaThread();
-		Signaller s = new Signaller(j);
-		s.start();
-		while( !JavaThread.go.get() ) {
-			Thread.yield();
+		Monitor m = new Monitor();
+		long start, end;
+		Signaller s = new Signaller(m);
+		synchronized(m) {
+			s.start();
+			while( !Monitor.go ) {
+				Thread.yield();
+			}
+			start = System.nanoTime();
+			for(int i = 1; i <= NoOfTimes; i += 1) {
+				m.wait();
+			}
+			end = System.nanoTime();
 		}
-		long start = System.nanoTime();
-		for(int i = 1; i <= NoOfTimes; i += 1) {
-			j.doWait();
-		}
-		long end = System.nanoTime();
-		go.set( false );
+		Monitor.go = false;
 		s.join();
 		System.out.println( (end - start) / NoOfTimes);
