线程池管理(1)-为何须要线程池

摘要

为何须要线程池呢,没想明白这个问题,看再多线程池的源码都没有用,先要知道线程池技术解决了什么问题,才能看的懂源码,由于全部的代码都是为了解决实际的工程问题。java

问题

抛几个问题,看看你是否知道,不知道的话,可能你对线程池的理解还不够深刻,仍是只知其一;不知其二。那么本文会对你有用,请继续看下去程序员

  • 线程池的线程数能够为1吗?
  • 线程数为1的线程池有存在的必要吗
  • 2个有5个核心线程的线程池和1个有10个核心线程的线程池有什么区别
  • 一个应用中如何管理线程池
  • 线程池池化技术和消息队列有什么区别

线程池原理

在大学里咱们学习c语言时,一个main函数写到底,就能够交做业了。刚开始工做时,mvc一路controller -> service -> dao就OK了。可是工做中写代码是要解决实际问题的。你啪啪啪写完了代码,用户发现你这个接口响应太慢了,怎么办?多线程

在这里插入图片描述
用户提交任务到程序执行完成,大体的过程如上图,提交一个task,而后有个线程去执行。
因此要提升​程序执行的效率能够从两个方面来考虑并发

  1. 异步,先响应,返回中间结果,而后异步处理,将结果返回
  2. 并发,多个线程来执行。

本篇说的线程池主要就是从1的维度来提升程序执行的效率mvc

生产者消费者模式

有必定工做经验的朋友对消息队列的削峰填谷,系统解耦确定不陌生。那么线程池,算不算削峰填谷呢?
异步化后,至关于把全部的task放在了队列中。也就是生产者 -> 容器 -> 消费者。以下图
在这里插入图片描述
从图能够看出,线程池技术使系统复杂了,也提供了更多的灵活性。经过队列的形式,咱们将任务的执行拆分红了生产者,消费者模式。每一步只用关心本身的事情。若是咱们的任务很复杂,咱们能够将任务拆分红不一样的步骤,每一步骤可使用不一样的线程池来解决,以此来提升效率。异步

可管理性

看上去经过线程池完美解决了咱们的问题,那么须要付出什么代价呢?cpu的资源是有限的,线程的建立也须要代价,咱们一个java应用进程的资源是毕竟是有限的。咱们不可能在应用中无限的建立线程池。因此咱们须要管理线程池。函数

一般,对于简单的应用,咱们使用一个单例线程池便可,让应用中的全部task都使用同一个线程池,防止一些初级程序员在应用中随意建立线程池,致使线程资源吃紧,线程占用过多的资源。学习

当应用中task比较复杂的时候,咱们就须要使用分治的思想,对线程池进行隔离。
好比有些是cpu密集型的,有些是IO密集型的;任务的重要程度也有轻重之分;任务的执行时间也有不一样。咱们须要对为这些任务创建不一样的线程池,以此来提升效率。线程

总结

线程池是一种异步化技术,经过预先建立线程/异步处理来提升响应速度。同时经过统一调配线程资源,能够下降线程的重复建立问题,提升线程的利用率,中心化管理有利于对资源的有效控制,防止滥用。code

关注【方丈的寺院】,与方丈一块儿开始技术修行之路

在这里插入图片描述

相关文章
相关标签/搜索