1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| public class GuardedObject<T> { private static final int TIMEOUT = 1; private static final Map<Object, GuardedObject> goMap = new ConcurrentHashMap<>();
private T obj; private final Lock lock = new ReentrantLock(); private final Condition done = lock.newCondition();
public static <K> GuardedObject create(K key) { GuardedObject go = new GuardedObject(); goMap.put(key, go); return go; }
public static <K, T> void fireEvent(K key, T obj) { GuardedObject go = goMap.remove(key); if (go != null) { go.onChange(obj); } }
public T get(Predicate<T> p) { lock.lock(); try { while (!p.test(obj)) { done.await(TIMEOUT, TimeUnit.SECONDS); } } catch (InterruptedException e) { throw new RuntimeException(e); } finally { lock.unlock(); } return obj; }
public void onChange(T obj) { lock.lock(); try { this.obj = obj; done.signalAll(); } finally { lock.unlock(); } } }
|