谈谈线程池:ThreadPoolExecutor

在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:

如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。

所以线程池出现了。线程池为线程声明周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。
使用线程池的好处:

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,
  • 使用线程池可以进行统一的分配,调优和监控。

Java中的线程池是用ThreadPoolExecutor类来实现的。

线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免过多线程来减少系统资源消耗和竞争,确保任务有序完成。ThreadPoolExecutor继承自AbstractExecutorService实现了ExecutorService接口,ScheduledThreadPoolExecutor继承自ThreadPoolExecutor实现了ExecutorService和ScheduledExecutorService接口。

参考文献

[1]线程池的使用:https://www.imooc.com/article/51147
[2]简单实现线程池:https://www.cnblogs.com/alimayun/p/9054027.html