首页 > 其他 > 详细

让ThreadPoolExecutor的workQueue占满时自动阻塞submit()方法

时间:2019-11-21 17:52:20      阅读:132      评论:0      收藏:0      [点我收藏+]
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/

让ThreadPoolExecutor的workQueue占满时自动阻塞submit()方法

原文:https://www.cnblogs.com/acbingo/p/11907062.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!