线程池技术在并发时经常会使用到,java中的线程池的使用是通过调用ThreadPoolExecutor来实现的。ThreadPoolExecutor提供了四个构造函数,最后都会归结于下面这个构造方法:
// 七个参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
这些参数的意义如下:
ThreadPoolExecutor工作流程
流程图如下:
大致过程陈述为:
线程池中使用的阻塞队列
阻塞队列常见的方法如下表所示:
方法名 | 说明 | 注意 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
常见四种线程池
线程池 | 使用的阻塞队列 | 线程池大小 | 超时 |
---|---|---|---|
CachedThreadPool | SynchronousQueue(队列长度无限 | 可增加,最大值Integer.MAX_VALUE | 默认60秒超时 |
FixedThreadPool | LinkedBlockingQueue(队列长度无限) | 可指定nThreads,固定数量 | 不会超时 |
newSingleThreadExecutor | LinkedBlockingQueue(队列长度无限), | 固定为1 | 不超时 |
newScheduledThreadPool | DelayedWorkQueue | 可增加,最大值Integer.MAX_VALUE | 不超时 |
它们通过Executors以静态方法的方式直接调用,实质上是它们最终调用的是ThreadPoolExecutor的构造方法,也就是本文最前面那段代码。
注:KeepAliveTime=0的话,表示不等待
《阿里巴巴java开发手册》中建议线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写的人员更加明确线程池的运行规则,规避资源耗尽的风险。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊html" target="_blank">教程。
本文向大家介绍Java中的接口知识汇总,包括了Java中的接口知识汇总的使用技巧和注意事项,需要的朋友参考一下 一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能。门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能。 分析:首先防盗门是一个门,门有开门和关门的功能,还有一把锁,锁有开锁和上锁,按照面向对象的编程的思想,我们会将门和锁都作为一个类而单独存在,但是,不能让防盗门继承自门的
本文向大家介绍js+jquery常用知识点汇总,包括了js+jquery常用知识点汇总的使用技巧和注意事项,需要的朋友参考一下 一、jquery源码中常见的知识点 1.string,number类型转换的快捷方法 分享一个面试例子: //加会将其后面自动转换成字符串 "64"+4="644" //减会将其自动转换成数字 "64"-4=60 2.bool类型转换 !!obj,将其强制
本文向大家介绍C#异常处理知识汇总,包括了C#异常处理知识汇总的使用技巧和注意事项,需要的朋友参考一下 概念 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常 但并不是所有的错误都是异常 而处理这种错误,称为异常处理 异常处理实际是不断去发掘异常、修改异常,使程序更稳定 异常处理主要表现在四个方面: 程序开发前:尽可能的想到会发生的错误,标注怎么处
我有一个示例代码。 当我设置queueSize 2时,我得到了异常,因为threadpool执行器不能插入一个任务到队列中,当我设置queueSize 3时是可以的。我不明白为什么当我设置maxSize=4时,测试是可以的。它来自留档。 如果线程数小于corePoolSize,请创建一个新线程以运行新任务 如果线程数等于(或大于)corePoolSize,则将任务放入队列 如果队列已满,且线程数小
本文向大家介绍Java内部类知识汇总,包括了Java内部类知识汇总的使用技巧和注意事项,需要的朋友参考一下 Java内部类 一、 含义 在Java编程语言里,程序是由类(class)构建而成的。在一个类的内部也可以声明类,我们把这样的类叫做内部类。 二、 作用 •实现了更好的封装,我们知道,普通类(非内部类)的访问修饰符不能为private或protected,而内部类可以。当我们将内部类声明
Java 相关知识点汇总,包括 Java 基础、Java 容器、Java 并发、JVM、编程规范、数据结构与算法、数据库、系统设计、设计模式、数据通信、网站架构、备战面试、Github 榜单。