package com.ldbc.driver.runtime; import java.util.Queue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedTransferQueue; public class DefaultQueues { public static <T> Queue<T> newNonBlocking() { return new ConcurrentLinkedQueue<>(); } public static <T> BlockingQueue<T> newBlockingUnbounded() { return new LinkedTransferQueue<>(); } public static final int DEFAULT_BOUND_1000 = 1000; public static <T> BlockingQueue<T> newBlockingBounded( int capacity ) { return new LinkedBlockingQueue<>( capacity ); } public static <T> BlockingQueue<T> newAlwaysBlockingBounded( int capacity ) { return new AlwaysBlockingLinkedBlockingQueue<>( capacity ); } /* turn offer() & add() into blocking calls (unless interrupted) */ private static class AlwaysBlockingLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> { public AlwaysBlockingLinkedBlockingQueue( int maxSize ) { super( maxSize ); } @Override public boolean offer( E e ) { try { put( e ); return true; } catch ( InterruptedException ie ) { Thread.currentThread().interrupt(); } return false; } @Override public boolean add( E e ) { try { put( e ); return true; } catch ( InterruptedException ie ) { Thread.currentThread().interrupt(); } return false; } } }