目录
前言:
时至今日,目前市场上的程序系统普遍都是多线程的程序,那究竟什么是线程呢?了解线程之前必须要知道一个概念 --- 进程。
1 、进程与线程
进程(Process):
在一个操作系统中安装了多个程序,当你需要启动一个程序的时候,在宏观上是不是双击程序快捷方式以启动程序,但在微观上是cpu将程序存储在硬盘上的程序代码或脚本调度到内存中运行,这样一个程序就启动了,启动的这个程序运行就是一个进程。系统运⾏⼀个程序即是 ⼀个进程从创建、运⾏到消亡的过程。
线程(Thread):
线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏,⼀个进程中⾄少有⼀个线程。⼀个进程中是可以有多个线程的,这个应⽤程序也可以称之为多线程程序。举个例子:譬如我双击启动了一个杀毒软件,这就是进程,那在这个杀毒软件中是不是有一些功能:内存清理、病毒查杀、电脑检查等等,当你在这个杀毒软件程序运行后点击这些功能时,这里面的每一个功能就是一个线程。
注:在javaWeb程序中,每次前端发起请求到后端服务器都是一个线程。
进程示例:
线程示例:
2、线程池
在了解线程池之前我们需要知道为什么要使用线程池(ThreadPool):没有使用线程池时当程序面对大量的并发请求时,每一个请求都需要创建一个新的线程来执行请求和任务,这样对系统的开销会非常高,线程创建和销毁也会非常的损耗资源,而且对于每个创建的线程没有统一管理的地方,每个线程创建后我们不知道线程的去向。
说了这么多,那究竟什么是线程池呢:线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务。简单来说就是一个池子,里面会事先创建好需要的线程,当有线程请求时,直接从线程池取线程执行即可。
接着我们看一下线程池有哪些主要的参数:
参数名 | 参数含义 |
---|---|
corePoolSize | 核心线程数 |
maxinumPoolSize | 最大线程数 |
keepAliveTime | 空闲线程存活时间 |
unit | 存活时间的单位 |
workQueue | 存放线程任务队列 |
threadFactory | 线程工厂,创建新线程 |
handler | 线程池拒绝处理后的任务 |
corePoolSize 线程池中 常驻核心线程数;
maximumPoolSize 线程池能够容纳的同时执行的 最大线程数,此值必须大于等于1;
keppAliveTime 多余 的空闲线程的 存活时间;
unit 存活时间 单位;
workQueue 任务队列,被提交但是尚未执行的任务;
threadFactory 表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认即可;
handler 拒绝策略,表示 队列满了并且工作线程大于等于线程池的最大线程数,如何处理。
3、数据库连接池
数据库连接池(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。
即在程序初始化的时候创建一定数量的数据库连接,用完可以放回去,下一个在接着用,通过配置连接池的参数来控制连接池中的初始连接数、最小连接、最大连接、最大空闲时间这些参数保证访问数据库的数量在一定可控制的范围类,防止系统崩溃,使用户的体验好。
数据库连接池参数:
最大的空闲时间:数据库连接对象所能存活的最大时间。
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
最大连接数:所能创建连接池的最大数目,如果数据库连接池连接请求超过该数目,这个请求就先等待。
4、连接池和线程池的区别
连接池:
1、连接池是面向数据库连接的
2、连接池是为了优化数据库连接资源
3、连接池有点类似在客户端做优化
线程池:
1、线程池是面向后台程序的
2、线程池是是为了提高内存和CPU效率
3、线程池有点类似于在服务端做优化