讓ThreadPoolExecutor的workQueue占滿時自動阻塞submit()方法


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/原創-讓threadpoolexecutor的workqueue占滿時自動阻塞submit方法/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM