То, что вы хотите сделать, это новый собственный ExecutorService, возможно, с использованием ThreadPoolExecutor . ThreadPoolExecutor имеет конструктор, который принимает BlockingQueue и для получения ограниченной очереди, которую вы используете, например ArrayBlockingQueue , правильно созданной для ограничения. Вы также можете включить RejectedExecutionHandler , чтобы определить, что делать, когда ваша очередь заполнена, или оставить ссылку на очередь блокировки и использовать методы предложения.
Вот небольшой пример:
BlockingQueue<Runnable> linkedBlockingDeque = new LinkedBlockingDeque<Runnable>(
100);
ExecutorService executorService = new ThreadPoolExecutor(1, 10, 30,
TimeUnit.SECONDS, linkedBlockingDeque,
new ThreadPoolExecutor.CallerRunsPolicy());