package com.openrobot.common; public class SleepyProducerConsumer { SleepyProducerConsumerInterface delegate; Object dataStore = null; Object data = null; Object waitObject = new Object(); Object full = new Object(); Object empty = new Object(); public SleepyProducerConsumer(SleepyProducerConsumerInterface delegate) { super(); this.delegate = delegate; (new Thread(new Producer())).start(); (new Thread(new Consumer())).start(); } public boolean setProducerData(Object newObject) { if (dataStore != null) { return false; } dataStore = newObject; synchronized(waitObject) { waitObject.notify(); } return true; } public void push(Object d) { synchronized(full) { if (data != null) try { full.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } data = d; synchronized(empty) { if (data != null) empty.notify(); } } public Object pop() { synchronized(empty) { if (data == null) try { empty.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Object o = data; data = null; synchronized(full) { if (data == null) full.notify(); } return o; } class Producer implements Runnable { public void run() { while (true) { while (dataStore == null) { System.out.println("DataStore was empty. Attempting wait...."); try { synchronized(waitObject) { waitObject.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("DataStore woken. Commencing push..."); Object o = dataStore; dataStore = null; push(o); } } } class Consumer implements Runnable { public void run() { while (true) { Object o = pop(); if (delegate != null) { delegate.sleepyConsumerThreadPoppedObject(o); } } } } }