线程的回收

本文档展示了如何使用C语言的pthread_join函数来阻塞等待线程结束,并获取该线程的退出状态。示例代码创建了一个新线程,该线程打印一条消息,休眠3秒后返回整数100。主线程通过pthread_join函数回收线程,并打印线程的退出信息。

线程回收函数 -阻塞等待回收
int pthread_join(pthread_t thread,void **retval)
thread 创建时传出的第一个参数
retval 代表传出线程的退出信息

pthread_rtn.c

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* thr(void *arg)
{
    printf("I am a thread! pid=%d,tid=%lu\n",getpid(),pthread_self());
    sleep(3);
    return (void*)100;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,thr,NULL);
    void *ret;
    pthread_join(tid,&ret); //线程回收
    printf("thread exit with %d\n",(int)ret);
    pthread_exit(NULL);
}
<think> 我们正在讨论线程池的线程回收策略。根据用户提供的引用内容,我们可以总结如下: 1. 线程池中的线程分为核心线程和非核心线程(尽管内部实现可能不区分,但逻辑上有这样的概念)。 2. 线程回收主要针对非核心线程,当它们空闲时间超过keepAliveTime时会被回收。 3. 核心线程默认不会回收,除非显式设置allowCoreThreadTimeOut为true。 4. 线程回收的发生时机是在工作线程从工作队列中获取任务时,如果等待超过keepAliveTime且当前线程数大于核心线程数,则回收线程。 我们需要详细解释线程池的线程回收策略,包括回收条件、回收过程以及如何配置。 另外,根据引用[5],线程池创建线程的规则也值得注意,因为回收策略与线程池的状态和线程数量密切相关。 回答结构建议: 1. 核心线程与非核心线程的概念 2. 默认回收策略(非核心线程超时回收,核心线程回收) 3. 如何配置核心线程超时回收(allowCoreThreadTimeOut) 4. 回收的具体触发时机和过程 5. 回收策略的重要性(避免资源泄漏,动态调整线程数) 同时,生成相关问题。 注意:引用内容已在用户输入中给出,我们需要在回答中适当引用(在相关句子末尾添加[^n])。 </think> ### 线程线程回收策略详解 #### 一、核心回收机制 1. **非核心线程回收** 当线程池中线程数超过核心线程数(`corePoolSize`)时: - 空闲线程在等待新任务时,若超过`keepAliveTime`时限会被自动回收[^3] - **回收触发点**:线程从工作队列(`workQueue`)获取任务时的等待超时 2. **核心线程保护** - 核心线程默认不会被回收(即使空闲)以维持基础服务能力[^3] - 可通过`allowCoreThreadTimeOut(true)`显式开启核心线程超时回收[^3] #### 二、回收流程与条件 ```mermaid graph TD A[线程尝试从workQueue获取任务] --> B{等待超过keepAliveTime?} B -->|是| C{当前线程数 > corePoolSize?} C -->|是| D[回收线程] C -->|否| E[保持存活等待任务] B -->|否| E ``` 关键控制点: 1. **线程数量阈值**:仅当`当前线程数 > corePoolSize`时才触发回收 2. **空闲时间窗口**:`keepAliveTime`参数决定空闲等待时长(单位:TimeUnit) 3. **队列状态**:回收发生在从阻塞队列获取任务时(如`LinkedBlockingQueue.take()`) #### 三、设计原理与资源管理 | **机制** | **作用** | **影响** | |----------------------|-------------------------------------------------------------------------|----------------------------------| | 默认保护核心线程 | 避免高频任务反复创建线程的开销 | 提升高频请求响应速度[^4] | | 动态回收非核心线程 | 自动释放闲置资源 | 减少内存占用和CPU竞争[^1] | | 超时回收开关(`allowCoreThreadTimeOut`) | 适应突发流量场景 | 可能导致核心服务能力波动[^3] | **示例场景**: 线程池配置 `corePoolSize=5`, `maximumPoolSize=10`, `keepAliveTime=60s`: 1. 流量高峰创建10线程 2. 流量下降后,5个非核心线程空闲超60秒被回收 3. 最终保留5个核心线程待命 #### 四、关键注意事项 1. **资源泄漏风险** 若不显式关闭线程池(`shutdown()`),部分线程可能永久驻留内存[^2] ```java // 正确关闭示例 executor.shutdown(); while (!executor.isTerminated()) { /* 等待终止 */ } ``` 2. **队列类型影响** - `SynchronousQueue`(同步移交):无队列缓冲,立即创建新线程[^4] - `LinkedBlockingQueue`(无界队列):优先使用已有线程回收频率低 - `ArrayBlockingQueue`(有界队列):队列满时才创建线程回收更频繁 3. **守护线程配置** 在Java Web项目中: ```java new ThreadFactoryBuilder().setDaemon(true).build(); // 避免阻止应用关闭[^4] ``` > 最佳实践:通过`ThreadPoolExecutor`构造函数显式配置参数,避免`Executors`默认配置的隐患[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值