1 5 package com.tctest; 6 7 import com.tc.object.config.ConfigVisitor; 8 import com.tc.object.config.DSOClientConfigHelper; 9 import com.tc.object.config.TransparencyClassSpec; 10 import com.tc.simulator.app.ApplicationConfig; 11 import com.tc.simulator.listener.ListenerProvider; 12 import com.tctest.runner.AbstractTransparentApp; 13 14 import java.util.concurrent.CyclicBarrier ; 15 import java.util.concurrent.LinkedBlockingQueue ; 16 17 public class LinkedBlockingQueueSingleNodeTestApp extends AbstractTransparentApp { 18 private static final int NUM_OF_PUTS = 1000; 19 private static final int NUM_OF_LOOPS = 1; 20 private static final int NUM_OF_PUTTER = 1; 21 private static final int NUM_OF_GETTER = 1; 22 23 private LinkedBlockingQueue queue = new LinkedBlockingQueue (); 24 25 public LinkedBlockingQueueSingleNodeTestApp(String appId, ApplicationConfig cfg, ListenerProvider listenerProvider) { 26 super(appId, cfg, listenerProvider); 27 } 28 29 public void run() { 30 try { 31 CyclicBarrier barrier = new CyclicBarrier (NUM_OF_PUTTER+NUM_OF_GETTER+1); 32 for (int i = 0; i < NUM_OF_LOOPS; i++) { 33 Thread [] putters = new Thread [NUM_OF_PUTTER]; 34 Thread [] getters = new Thread [NUM_OF_GETTER]; 35 for (int j = 0; j < NUM_OF_PUTTER; j++) { 36 putters[j] = new Thread (new Putter(barrier, queue, NUM_OF_GETTER)); 37 } 38 for (int j = 0; j < NUM_OF_GETTER; j++) { 39 getters[j] = new Thread (new Getter(barrier, queue)); 40 } 41 for (int j = 0; j < NUM_OF_PUTTER; j++) { 42 putters[j].start(); 43 } 44 for (int j = 0; j < NUM_OF_GETTER; j++) { 45 getters[j].start(); 46 } 47 } 48 barrier.await(); 49 } catch (Throwable t) { 50 notifyError(t); 51 } 52 } 53 54 private static class Getter implements Runnable { 55 private LinkedBlockingQueue queue; 56 private CyclicBarrier barrier; 57 58 public Getter(CyclicBarrier barrier, LinkedBlockingQueue queue) { 59 this.barrier = barrier; 60 this.queue = queue; 61 } 62 63 public void run() { 64 try { 65 while (true) { 66 Object o = queue.take(); 67 if ("STOP".equals(o)) { 68 break; 69 } 70 WorkItem w = (WorkItem) o; 71 System.out.println("Getting " + w.getI()); 72 } 73 barrier.await(); 74 } catch (Exception e) { 75 throw new AssertionError (e); 76 } 77 } 78 } 79 80 private static class Putter implements Runnable { 81 private CyclicBarrier barrier; 82 private LinkedBlockingQueue queue; 83 private int numOfGetter; 84 85 public Putter(CyclicBarrier barrier, LinkedBlockingQueue queue, int numOfGetter) { 86 this.barrier = barrier; 87 this.queue = queue; 88 this.numOfGetter = numOfGetter; 89 } 90 91 public void run() { 92 try { 93 for (int i = 0; i < NUM_OF_PUTS; i++) { 94 System.out.println("Putting " + i); 95 queue.put(new WorkItem(i)); 96 } 97 for (int i = 0; i < numOfGetter; i++) { 98 queue.put("STOP"); 99 } 100 barrier.await(); 101 } catch (Exception e) { 102 throw new AssertionError (e); 103 } 104 } 105 } 106 107 public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) { 108 String testClass = LinkedBlockingQueueSingleNodeTestApp.class.getName(); 109 TransparencyClassSpec spec = config.getOrCreateSpec(testClass); 110 111 config.addIncludePattern(testClass + "$*"); 112 113 String methodExpression = "* " + testClass + "*.*(..)"; 114 config.addWriteAutolock(methodExpression); 115 116 spec.addRoot("queue", "queue"); 117 } 118 119 private static class WorkItem { 120 private final int i; 121 122 public WorkItem(int i) { 123 this.i = i; 124 } 125 126 public int getI() { 127 return this.i; 128 } 129 } 130 } 131
| Popular Tags
|