package com.ldbc.driver.runtime; import java.util.Queue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.locks.LockSupport; public abstract class QueueEventSubmitter<EVENT_TYPE> { public static <TYPE> QueueEventSubmitter<TYPE> queueEventSubmitterFor(Queue<TYPE> queue) { return (BlockingQueue.class.isAssignableFrom(queue.getClass())) ? new BlockingQueueEventSubmitter((BlockingQueue) queue) : new NonBlockingQueueEventSubmitter(queue); } public abstract void submitEventToQueue(EVENT_TYPE event) throws InterruptedException; static class NonBlockingQueueEventSubmitter<EVENT_TYPE_NON_BLOCKING> extends QueueEventSubmitter<EVENT_TYPE_NON_BLOCKING> { private final Queue<EVENT_TYPE_NON_BLOCKING> queue; private NonBlockingQueueEventSubmitter(Queue<EVENT_TYPE_NON_BLOCKING> queue) { this.queue = queue; } @Override public void submitEventToQueue(EVENT_TYPE_NON_BLOCKING event) throws InterruptedException { while (false == queue.offer(event)) { LockSupport.parkNanos(1); } } } static class BlockingQueueEventSubmitter<EVENT_TYPE_BLOCKING> extends QueueEventSubmitter<EVENT_TYPE_BLOCKING> { private final BlockingQueue<EVENT_TYPE_BLOCKING> queue; private BlockingQueueEventSubmitter(BlockingQueue<EVENT_TYPE_BLOCKING> queue) { this.queue = queue; } @Override public void submitEventToQueue(EVENT_TYPE_BLOCKING event) throws InterruptedException { queue.put(event); } } }