--- a/jdk/test/java/util/concurrent/LinkedBlockingQueue/OfferRemoveLoops.java Tue Jul 28 11:15:49 2009 +0800
+++ b/jdk/test/java/util/concurrent/LinkedBlockingQueue/OfferRemoveLoops.java Tue Jul 28 13:24:52 2009 -0700
@@ -28,62 +28,74 @@
* @author Martin Buchholz
*/
+import java.util.*;
import java.util.concurrent.*;
public class OfferRemoveLoops {
- private static void realMain(String[] args) throws Throwable {
+ void test(String[] args) throws Throwable {
testQueue(new LinkedBlockingQueue<String>(10));
testQueue(new LinkedBlockingQueue<String>());
testQueue(new LinkedBlockingDeque<String>(10));
testQueue(new LinkedBlockingDeque<String>());
testQueue(new ArrayBlockingQueue<String>(10));
testQueue(new PriorityBlockingQueue<String>(10));
+ testQueue(new ConcurrentLinkedQueue<String>());
}
- private abstract static class ControlledThread extends Thread {
+ abstract class CheckedThread extends Thread {
abstract protected void realRun();
public void run() {
try { realRun(); } catch (Throwable t) { unexpected(t); }
}
}
- private static void testQueue(final BlockingQueue<String> q) throws Throwable {
- System.out.println(q.getClass());
- final int count = 10000;
- final long quittingTime = System.nanoTime() + 1L * 1000L * 1000L * 1000L;
- Thread t1 = new ControlledThread() {
- protected void realRun() {
- for (int i = 0, j = 0; i < count; i++)
- while (! q.remove(String.valueOf(i))
- && System.nanoTime() - quittingTime < 0)
- Thread.yield();}};
- Thread t2 = new ControlledThread() {
- protected void realRun() {
- for (int i = 0, j = 0; i < count; i++)
- while (! q.offer(String.valueOf(i))
- && System.nanoTime() - quittingTime < 0)
- Thread.yield();}};
+ void testQueue(final Queue<String> q) throws Throwable {
+ System.out.println(q.getClass().getSimpleName());
+ final int count = 1000 * 1000;
+ final long testDurationSeconds = 1L;
+ final long testDurationMillis = testDurationSeconds * 1000L;
+ final long quittingTimeNanos
+ = System.nanoTime() + testDurationSeconds * 1000L * 1000L * 1000L;
+ Thread t1 = new CheckedThread() {
+ protected void realRun() {
+ for (int i = 0; i < count; i++) {
+ if ((i % 1024) == 0 &&
+ System.nanoTime() - quittingTimeNanos > 0)
+ return;
+ while (! q.remove(String.valueOf(i)))
+ Thread.yield();
+ }}};
+ Thread t2 = new CheckedThread() {
+ protected void realRun() {
+ for (int i = 0; i < count; i++) {
+ if ((i % 1024) == 0 &&
+ System.nanoTime() - quittingTimeNanos > 0)
+ return;
+ while (! q.offer(String.valueOf(i)))
+ Thread.yield();
+ }}};
t1.setDaemon(true); t2.setDaemon(true);
t1.start(); t2.start();
- t1.join(10000); t2.join(10000);
+ t1.join(10 * testDurationMillis);
+ t2.join(10 * testDurationMillis);
check(! t1.isAlive());
check(! t2.isAlive());
}
//--------------------- Infrastructure ---------------------------
- static volatile int passed = 0, failed = 0;
- static void pass() { passed++; }
- static void fail() { failed++; Thread.dumpStack(); }
- static void unexpected(Throwable t) { failed++; t.printStackTrace(); }
- static void check(boolean cond) { if (cond) pass(); else fail(); }
- static void equal(Object x, Object y) {
+ volatile int passed = 0, failed = 0;
+ void pass() {passed++;}
+ void fail() {failed++; Thread.dumpStack();}
+ void fail(String msg) {System.err.println(msg); fail();}
+ void unexpected(Throwable t) {failed++; t.printStackTrace();}
+ void check(boolean cond) {if (cond) pass(); else fail();}
+ void equal(Object x, Object y) {
if (x == null ? y == null : x.equals(y)) pass();
- else {System.out.println(x + " not equal to " + y); fail(); }}
-
+ else fail(x + " not equal to " + y);}
public static void main(String[] args) throws Throwable {
- try { realMain(args); } catch (Throwable t) { unexpected(t); }
-
+ new OfferRemoveLoops().instanceMain(args);}
+ public void instanceMain(String[] args) throws Throwable {
+ try {test(args);} catch (Throwable t) {unexpected(t);}
System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
- if (failed > 0) throw new Exception("Some tests failed");
- }
+ if (failed > 0) throw new AssertionError("Some tests failed");}
}