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