use blocking bounded queues in places where backpressure is most needed (e.g, when submitting work to thread pools) and non-blocking when low latency is most needed (e.g., submitted results from finish handler, so thread is freed as soon as possible)
add Queue implementation that also blocks on add() and offer() to make sure Executor doesn't crash when the queue is full