ThreadPoolExecutor如何创建任务队列
时间: 2023-10-17 17:17:50 浏览: 88
ThreadPoolExecutor类在创建线程池时提供了三个参数来控制任务队列:corePoolSize、maximumPoolSize和workQueue。
其中,workQueue参数用于指定任务队列的类型。ThreadPoolExecutor支持以下四种任务队列类型:
1. 直接提交队列(SynchronousQueue):这是一个没有容量的队列,每个插入操作都必须等待一个相应的删除操作,因此这种任务队列类型会将任务直接提交给线程池中的线程来处理,而不会将任务保存在队列中。
2. 有界任务队列(ArrayBlockingQueue):这是一个容量固定的队列,当线程池中的线程数达到corePoolSize时,新的任务将被放入该队列,直到队列满。此时,如果继续有新的任务提交,线程池会创建额外的线程来处理这些任务,直到线程数达到maximumPoolSize为止。
3. 无界任务队列(LinkedBlockingQueue):这是一个容量无限的队列,当线程池中的线程数达到corePoolSize时,新的任务将被放入该队列,不会有任务被拒绝。此时,如果继续有新的任务提交,线程池不会创建额外的线程来处理这些任务,而是让这些任务一直等待到有空闲的线程为止。
4. 优先任务队列(PriorityBlockingQueue):这是一个基于优先级的无限容量队列,可以根据任务的优先级来决定任务的执行顺序。
在创建ThreadPoolExecutor对象时,可以通过第三个参数workQueue来指定任务队列类型,例如:
```
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize))
```
这里使用的是有界任务队列ArrayBlockingQueue,队列的容量为queueSize。如果要使用其他类型的任务队列,只需要将new ArrayBlockingQueue<Runnable>(queueSize)替换为相应的队列类型即可。
阅读全文