Last active
March 14, 2018 02:32
-
-
Save siasur/9136814ebe1b3e087d0674c6c45c6379 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class MessageQueue<T> { | |
private static final int MAX_SIZE = 255; | |
private T[] messages; | |
private int lastReadIndex; | |
private int lastInsertIndex; | |
private int adjustIndex(int index) { | |
if (index >= MAX_SIZE) { | |
return 0; | |
} | |
return index; | |
} | |
/** | |
* Constructor of the {@link MessageQueue} | |
* | |
* @author Mischa | |
*/ | |
@SuppressWarnings("unchecked") // Java doesn't like to create an Array of a generic type... | |
public MessageQueue() { | |
messages = (T[]) new Object[MAX_SIZE]; | |
} | |
/** | |
* Pushes a new entry into the queue. | |
* This function will block when the queue is full. | |
* | |
* @param msg The entry to push on the stack | |
* @throws InterruptedException | |
*/ | |
public synchronized void push(T msg) throws InterruptedException { | |
int newIndex = adjustIndex(lastInsertIndex + 1); | |
// Check if we can push the message | |
while (messages[newIndex] != null) { | |
wait(); | |
} | |
// Push the message | |
messages[newIndex] = msg; | |
lastInsertIndex = newIndex; | |
notifyAll(); | |
} | |
/** | |
* Pulls one entry from the queue. | |
* The entry will be returned and removed from the queue. | |
* | |
* @return The entry from the queue | |
*/ | |
public synchronized T pull() { | |
int newIndex = adjustIndex(lastReadIndex + 1); | |
T shouldReturn = messages[newIndex]; | |
messages[newIndex] = null; | |
lastReadIndex = newIndex; | |
notifyAll(); | |
return shouldReturn; | |
} | |
/** | |
* Checks if there is an entry in the queue. | |
* | |
* @return <code>true</code>, when there is an entry in the queue | |
*/ | |
public synchronized Boolean hasMessage() { | |
if (lastInsertIndex > -1) { | |
int newIndex = adjustIndex(lastReadIndex + 1); | |
if (messages[newIndex] != null) { | |
return true; | |
} | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment