Java并发编程:线程状态与线程池深度解析

1 下载量 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开发者必备的技能之一。