Concurrency Unit Test First Attempt

From ExtremeProgrammingChallengeFourteenTheBug.


import java.util.*;

public class BoundedBuffer {

synchronized
void put(Object x) throws InterruptedException {
/***/ TestBB.doSleep();
while ( occupied == buffer.length )
wait();
notify();
/***/ TestBB.doSleep();
++occupied;
putAt %= buffer.length;
buffer[putAt++] = x;
}

synchronized Object take() throws InterruptedException { while ( occupied == 0 ) wait(); notify(); /***/ TestBB.doSleep(); --occupied; takeAt %= buffer.length; return buffer[takeAt++]; }

private Object[] buffer = new Object[1]; private int putAt, takeAt, occupied;

}

class TestBB extends Thread {

private static int[]c1sleeps = {0};
private static int[]c2sleeps = {0};
private static int[]p1sleeps = {0,0,250};
private static int[]p2sleeps = {0,500};

private static BoundedBuffertheBB = new BoundedBuffer(); private static Hashtablethreads = new Hashtable();

public static void main(String[] args) throws Throwable { TestBB c1 = new TestBB(c1sleeps) { public void run() { try { System.out.println("C1 takes:"+theBB.take()); } catch (InterruptedException ie) {} } }; TestBB c2 = new TestBB(c2sleeps) { public void run() { try { System.out.println("C2 takes:"+theBB.take()); } catch (InterruptedException ie) {} } }; TestBB p1 = new TestBB(p1sleeps) { public void run() { try { System.out.println("P1 puts 'A'"); theBB.put("A"); } catch (InterruptedException ie) {} } }; TestBB p2 = new TestBB(p2sleeps) { public void run() { try { System.out.println("P2 puts 'B'"); theBB.put("B"); } catch (InterruptedException ie) {} } }; c1.start(); c2.start(); p1.start(); p2.start(); Thread.sleep(5000); if (p1.isAlive() || p2.isAlive()) { System.out.println("Liveness problem detected."); } }

public TestBB(int[] sleeps) { threads.put(Thread.currentThread(),sleeps); }

public static void doSleep() { int[] sleepsForThread = (int[])threads.get(Thread.currentThread()); if (sleepsForThread != null) { int current = sleepsForThread[0] % sleepsForThread.length; sleepsForThread[0]++; try { Thread.sleep(sleepsForThread[current]); } catch(InterruptedException ie) {} } }
}


EditText of this page (last edited November 2, 2000) or FindPage with title or text search