java中Executors.newFixedThreadPool的任务队列默认大小是多少?
时间: 2023-10-28 07:50:15 浏览: 106
在Java中,Executors.newFixedThreadPool()方法创建一个固定大小的线程池,该线程池中包含一定数量的线程,可以同时执行一定数量的任务。任务队列的默认大小是Integer.MAX_VALUE,也就是说,任务队列可以无限制地添加新的任务。但是,这个默认值可能会因为特定的系统设置而有所不同。如果需要限制任务队列的大小,可以使用Executors.newFixedThreadPool(int nThreads, BlockingQueue<Runnable> queue)方法,并指定一个适当的阻塞队列作为任务队列。
相关问题
java中Executors.newFixedThreadPool常用的阻塞队列有哪些?
在Java中,常用的阻塞队列有以下几种:
1. ArrayBlockingQueue:一个由数组支持的有界阻塞队列。在构造时需要指定容量,一旦队列满了,就会阻塞生产者线程,直到队列中有空闲位置。
2. LinkedBlockingQueue:一个由链表支持的可选有界阻塞队列。如果在构造时指定了容量,那么它就是有界的,否则就是无界的。在生产者线程往队列中添加元素时,如果队列已满,则会阻塞生产者线程,直到队列中有空闲位置。
3. SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待另一个线程的移除操作,否则插入操作会一直阻塞。
4. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。元素按照它们的自然顺序或者实现了Comparable接口的顺序进行排序,也可以在构造时指定一个Comparator比较器来指定排序规则。
以上是常用的几种阻塞队列,其中 ArrayBlockingQueue 和 LinkedBlockingQueue 是 Executor 框架默认的队列实现。
Executors.newFixedThreadPool()注意事项
`Executors.newFixedThreadPool()`是Java并发包提供的工具类,用于创建固定大小的工作线程池。以下是使用这个方法创建线程池时需要注意的几点:
1. **线程数设置**:你需要预先确定线程池的大小,这个大小取决于你的应用需求,过多可能导致资源浪费,过少可能导致任务处理速度慢。
2. **拒绝策略**:线程池满时,会有一个默认的拒绝策略,如果新提交的任务无法立即执行(工作线程已全部忙),那么它会被丢弃(AbortPolicy)。如果你需要自定义策略(如循环尝试、排队等待等),可以传递一个`RejectedExecutionHandler`实例给构造函数。
3. **守护线程**:默认情况下,新FixedThreadPool创建的线程不是守护线程,这意味着它们会在应用程序关闭前继续运行。如果你希望这些线程在主应用退出时自动结束,需将其设置为守护线程(通过`setDaemon(true)`)。
4. **生命周期管理**:`newFixedThreadPool`返回的是一个`ExecutorService`,你应该在不再需要时调用`shutdown`或`shutdownNow`来关闭它,防止内存泄漏。
5. **同步与并发**:由于线程池的存在,你需要确保对共享数据的访问是线程安全的,特别是在任务队列和结果处理上。
阅读全文