线程池若干问题

16 篇文章 0 订阅
6 篇文章 0 订阅

  1. 线程池中线程异常后,销毁还是复用?

  2. 线程池在提交任务前,可以提前创建线程吗?

线程池中线程异常后,销毁还是复用?

直接说结论,需要分两种情况:

  • 使用execute()提交任务:当任务通过execute()提交到线程池并在执行过程中抛出异常时,如果这个异常没有在任务内被捕获,那么该异常会导致当前线程终止,并且异常会被打印到控制台或日志文件中。线程池会检测到这种线程终止,并创建一个新线程来替换它,从而保持配置的线程数不变。

  • 使用submit()提交任务:对于通过submit()提交的任务,如果在任务执行中发生异常,这个异常不会直接打印出来。相反,异常会被封装在由submit()返回的Future对象中。当调用Future.get()方法时,可以捕获到一个ExecutionException。在这种情况下,线程不会因为异常而终止,它会继续存在于线程池中,准备执行后续的任务。

简单来说:使用execute()时,未捕获异常导致线程终止,线程池创建新线程替代;使用submit()时,异常被封装在Future中,线程继续复用。

这种设计允许submit()提供更灵活的错误处理机制,因为它允许调用者决定如何处理异常,而execute()则适用于那些不需要关注执行结果的场景。

具体的源码分析可以参考这篇:线程池中线程异常后:销毁还是复用?- 京东技术

线程池在提交任务前,可以提前创建线程吗?

答案是可以的!ThreadPoolExecutor 提供了两个方法帮助我们在提交任务之前,完成核心线程的创建,从而实现线程池预热的效果:

  • prestartCoreThread():启动一个线程,等待任务,如果已达到核心线程数,这个方法返回 false,否则返回 true;

  • prestartAllCoreThreads():启动所有的核心线程,并返回启动成功的核心线程数。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的C语言实现线程池的例子: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREAD_NUM 5 #define QUEUE_SIZE 10 typedef struct { void (*function)(void *); void *argument; } task_t; typedef struct { task_t *queue; int front, rear; int size; int count; pthread_mutex_t lock; pthread_cond_t not_empty; pthread_cond_t not_full; } thread_pool_t; void *worker_thread(void *arg) { thread_pool_t *pool = (thread_pool_t *)arg; task_t task; while (1) { pthread_mutex_lock(&(pool->lock)); while (pool->count == 0) { pthread_cond_wait(&(pool->not_empty), &(pool->lock)); } task = pool->queue[pool->front]; pool->front = (pool->front + 1) % pool->size; pool->count--; pthread_cond_signal(&(pool->not_full)); pthread_mutex_unlock(&(pool->lock)); (*(task.function))(task.argument); } pthread_exit(NULL); } void initialize_thread_pool(thread_pool_t *pool) { pthread_mutex_init(&(pool->lock), NULL); pthread_cond_init(&(pool->not_empty), NULL); pthread_cond_init(&(pool->not_full), NULL); pool->queue = (task_t *)malloc(sizeof(task_t) * QUEUE_SIZE); pool->front = 0; pool->rear = -1; pool->size = QUEUE_SIZE; pool->count = 0; int i; for (i = 0; i < THREAD_NUM; i++) { pthread_t tid; pthread_create(&tid, NULL, worker_thread, (void *)pool); } } void add_task(thread_pool_t *pool, void (*function)(void *), void *argument) { pthread_mutex_lock(&(pool->lock)); while (pool->count == pool->size) { pthread_cond_wait(&(pool->not_full), &(pool->lock)); } pool->rear = (pool->rear + 1) % pool->size; pool->queue[pool->rear].function = function; pool->queue[pool->rear].argument = argument; pool->count++; pthread_cond_signal(&(pool->not_empty)); pthread_mutex_unlock(&(pool->lock)); } int main() { thread_pool_t pool; initialize_thread_pool(&pool); // add tasks to the thread pool // ... return 0; } ``` 这个例子中,我们实现了一个线程池,其中包含了一个任务队列和若干个工作线程。当有新的任务加入到队列中时,会有一个工作线程从队列中取出任务并执行。如果队列已满或者队列中没有任务,则等待条件变量的信号。在这个例子中,我们使用了pthread库来创建线程和互斥锁,以及条件变量来控制线程的同步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值