http://gvace.blogspot.com/2016/08/blockingqueue.html
In addition to the simple take() and offer() API, BlockingQueue offers another way
to interact with the queue that provides even more control, at the cost of a bit of
extra complexity. This is the possibility of putting or taking with a timeout, to allow
the thread encountering issues to back out from its interaction with the queue and do something else instead.
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class BlockingQueueTest1 {
public static void main(String[] args) {
final Update.Builder ub = new Update.Builder();
final BlockingQueue<Update> lbq = new LinkedBlockingQueue<>(100);
MicroBlogExampleThread t1 = new MicroBlogExampleThread(lbq, 10) {
public void doAction() {
text = text + "X";
Update u = ub.author(new Author("Tallulah")).updateText(text)
.build();
boolean handed = false;
try {
handed = updates.offer(u, 100, TimeUnit.MILLISECONDS);//set timeout
} catch (InterruptedException e) {
}
if (!handed)
System.out.println("Unable to hand off Update to Queue due to timeout");
else System.out.println("Offered");
}
};
MicroBlogExampleThread t2 = new MicroBlogExampleThread(lbq, 1000) {
public void doAction() {
Update u = null;
try {
u = updates.take();
System.out.println("Took");
} catch (InterruptedException e) {
return;
}
}
};
t1.start();
t2.start();
}
}
abstract class MicroBlogExampleThread extends Thread {
protected final BlockingQueue<Update> updates;
protected String text = "";
protected final int pauseTime;
private boolean shutdown = false;
public MicroBlogExampleThread(BlockingQueue<Update> lbq_, int pause_) {
updates = lbq_;
pauseTime = pause_;
}
public synchronized void shutdown() {
shutdown = true;
}
@Override
public void run() {
while (!shutdown) {
doAction();
try {
Thread.sleep(pauseTime);
} catch (InterruptedException e) {
shutdown = true;
}
}
}
public abstract void doAction();
}
Followed a TransferQueue which is a little more efficient.
http://gvace.blogspot.com/2016/08/transferqueue.html
No comments:
Post a Comment