Java并发编程线程池任务队列
类
ThreadPoolExecutor
最常使用的构造方法是:ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue
)
参数解释如下:
corePoolSize
:池中所保存的线程数,包括空闲线程,也就是核心池的大小。maximumPoolSize
:池中允许的最大线程数。keepAliveTime
:当线程数量大于corePoolSize
值时,在没有超过指定的时间内是不从线程池中将空闲线程删除的,如果超过此时间单位,则删除。unit
:keepAliveTime
参数的时间单位。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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不限于runnable, 如果核心线程数都在忙碌,新任务都会包装为任务加入workQueue中。
submit方法写的明明白白,最终通过你的callable创建一个
通过excute方法执行。。。。也就是说callable也是通过excute执行的
哪个书上写的“此队列仅保持由
execute
方法提交的Runnable
任务”啊executor(Runnable)方法是在Executor接口中定义的,而submit(有三个重载方法)方法是Executor的扩展接口ExecutorService中定义的。
而AbastractExecutorService是ExecutorService的抽象实现类,该抽象类中对submit方法做了实现,其内部仍然调用了自身的execute方法。
所以,不管你是直接调用execute方法,还是调用submit方法,最后都调用了execute方法,而调用submit方法的区别就是可以返回一个Future。