Java并发编程:线程状态与线程池深度解析
65 浏览量
更新于2024-08-04
收藏 769KB PDF 举报
本讲义主要探讨了Java并发编程中的线程状态及其转换,以及线程池的相关知识,是面试中的重要考点。
在Java中,线程共有六种状态,这些状态反映了线程在不同阶段的行为特征:
1. **新建**:线程对象创建后,但在调用`start()`方法之前,线程并未与操作系统的底层线程关联,处于新建状态。
2. **可运行**:调用`start()`方法后,线程进入可运行状态,这时线程已经与操作系统底层线程关联,等待操作系统调度执行。
3. **终结**:线程内部的代码执行完毕后,线程会从可运行状态进入终结状态,这时线程会取消与底层线程的关联,表示线程生命周期结束。
4. **阻塞**:当线程尝试获取锁但失败时,会进入Monitor的阻塞队列,不占用CPU时间。当持有锁的线程释放锁,会按照特定规则唤醒阻塞队列中的线程,使其变为可运行状态。
5. **等待**:如果线程已经获取到锁,但因条件不满足而调用`wait()`方法,线程会释放锁进入Monitor等待集合,不再占用CPU时间。其他持锁线程通过`notify()`或`notifyAll()`唤醒等待线程,使其恢复到可运行状态并重新竞争锁。
6. **有时限等待**:与等待状态相似,但线程调用`wait(long)`方法后,会设定一个等待时限,若超时未被唤醒,线程会自动恢复为可运行状态,再次尝试获取锁。同样,如果被其他线程唤醒,线程也会进入可运行状态。
此外,还有线程调用`sleep(long)`方法的情况,这会导致线程从可运行状态进入有时限等待状态,但与Monitor无关,超时后线程会自动恢复到可运行状态。
线程状态的转换是一个复杂的过程,涉及到了Java多线程同步机制,如锁、条件变量等。线程可以通过`interrupt()`方法中断等待和有时限等待状态,或者通过`park()`和`unpark()`方法实现线程的等待和唤醒。
另一方面,线程池是Java并发编程中的重要工具,它具有七项核心参数:
1. **corePoolSize**:核心线程数,即使空闲时,线程池也会保留这些线程。
2. **maximumPoolSize**:最大线程数,超过这个数量的新增线程将会被阻塞。
3. **keepAliveTime**:非核心线程在空闲时的存活时间,达到该时间后会被销毁。
4. **unit**:定义`keepAliveTime`的时间单位。
5. **workQueue**:工作队列,用于存放等待执行的任务。
6. **threadFactory**:线程工厂,用于创建新线程。
7. **handler**:拒绝策略,当工作队列满且无法创建新线程时,处理新提交任务的策略。
理解线程状态转换和线程池的参数设置对于优化并发程序性能和控制资源消耗至关重要,是Java开发者必备的技能之一。
2021-06-11 上传
2020-03-12 上传
2023-06-14 上传
2023-08-25 上传
2023-07-18 上传
2023-11-30 上传
2023-07-30 上传
2024-01-27 上传
2023-05-13 上传
熊猫-IT
- 粉丝: 5044
- 资源: 173
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解