Java并发编程线程池任务队列

发布于 2022-09-12 04:36:20 字数 2328 浏览 10 评论 0

ThreadPoolExecutor最常使用的构造方法是:
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue
参数解释如下:

  • corePoolSize:池中所保存的线程数,包括空闲线程,也就是核心池的大小。
  • maximumPoolSize:池中允许的最大线程数。
  • keepAliveTime:当线程数量大于corePoolSize值时,在没有超过指定的时间内是不从线程池中将空闲线程删除的,如果超过此时间单位,则删除。
  • unitkeepAliveTime参数的时间单位。
  • workQueue:执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable任务。

其中workQueue参数的解释对吗?我运行下面的例子发现submit提交的Callable任务一样会占用workQueue,书上错了吗

public class Main {

    static class MyCallable implements Callable<String> {
        private int age;

        public MyCallable(int age) {
            super();
            this.age = age;
        }

        public String call() throws Exception {
            Thread.sleep(1000);
            System.out.println("年龄是:" + age);
            return "返回值 年龄是:" + age;
        }
    }


    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(7, 8, 5, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1));

        executor.submit(new MyCallable(1));// 1
        executor.submit(new MyCallable(2));// 2
        executor.submit(new MyCallable(3));// 3
        executor.submit(new MyCallable(4));// 4
        executor.submit(new MyCallable(5));// 5
        executor.submit(new MyCallable(6));// 6
        executor.submit(new MyCallable(7));// 7
        executor.submit(new MyCallable(8));// 8
        executor.submit(new MyCallable(9));// 9
        // executor.submit(new MyCallable(10));// 10

        Thread.sleep(300);
        System.out.println("A:" + executor.getCorePoolSize());
        System.out.println("A:" + executor.getPoolSize());
        System.out.println("A:" + executor.getQueue().size());
        Thread.sleep(5000);
        System.out.println("B:" + executor.getCorePoolSize());
        System.out.println("B:" + executor.getPoolSize());
        System.out.println("B:" + executor.getQueue().size());
        executor.shutdown();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

分分钟 2022-09-19 04:36:20

不限于runnable, 如果核心线程数都在忙碌,新任务都会包装为任务加入workQueue中。

弥繁 2022-09-19 04:36:20

image.png
submit方法写的明明白白,最终通过你的callable创建一个image.png
通过excute方法执行。。。。也就是说callable也是通过excute执行的

第七度阳光i 2022-09-19 04:36:20

哪个书上写的“此队列仅保持由execute方法提交的Runnable任务”啊

七堇年 2022-09-19 04:36:20

executor(Runnable)方法是在Executor接口中定义的,而submit(有三个重载方法)方法是Executor的扩展接口ExecutorService中定义的。
而AbastractExecutorService是ExecutorService的抽象实现类,该抽象类中对submit方法做了实现,其内部仍然调用了自身的execute方法。
所以,不管你是直接调用execute方法,还是调用submit方法,最后都调用了execute方法,而调用submit方法的区别就是可以返回一个Future。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文