public class BlockingSubmitExecutor { private ExecutorService executor = new ThreadPoolExecutor(2, 2 * 2, 1, TimeUnit.MINUTES, new OfferBlockingQueue<>(10), new ThreadFactoryBuilder().setNameFormat("push-scheduler-%d").build(), new ThreadPoolExecutor.AbortPolicy()); private static final class OfferBlockingQueue<E> extends LinkedBlockingQueue<E> { public OfferBlockingQueue(int capacity) { super(capacity); } @Override public boolean offer(@NotNull E e) { try { // ThreadPoolExecutor 底層workQueue調用的offer來入隊.offer不會block,這裏改爲put,當隊列滿時可阻塞住submit put(e); return true; } catch (InterruptedException ex) { Thread.currentThread().interrupt(); return false; } } } @Test public void test() { for (int i = 0; i < 10; i++) { int finalI = i; executor.submit(() -> { System.out.println("Thread start:" + finalI); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread finish:" + finalI); }); } try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }
參考:
https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E8%AE%A9threadpoolexecutor%E7%9A%84workqueue%E5%8D%A0%E6%BB%A1%E6%97%B6%E8%87%AA%E5%8A%A8%E9%98%BB%E5%A1%9Esubmit%E6%96%B9%E6%B3%95/ide