02-线程池

1. 线程池概念

现有问题:

  • 线程是宝贵的内存资源、单个线程约占1MB的空间,过多分配易造成内存溢出;
  • 频繁的创建及销毁会增加虚拟机回收频率、资源开销,造成程序性能下降。

线程池:

  • 线程容器,可设定线程分配的数量上限;
  • 将预先创建的线程对象存入池中,并重用线程池中的线程对象;
  • 避免频繁的创建和销毁。

2. 线程池原理

将任务提交给线程池,由线程池分配线程、运行任务,并在当前任务结束后复用线程。
image-20230316135940625

  • 应用与线程池的交互和线程池的内部工作过程:

image-20200817000106890

3. 线程池创建

常用的线程池接口和类:
Executor // 接口,线程池的顶级接口
ExecutorService //接口,线程池接口,可通过Future<?> submit(Runnable task)提交任务代码
Executors // 工厂类,通过此类可以创建一个线程池4种方式
(1)通过 Executors.newFixedThreadPool(int nThreads) 获取固定数量的线程池
@nThreads int 指定线程池中线程的数量
@return ExecutorService 接口类型引用
(2)通过 Executors.newCachedThreadPool()获得动态数量的线程池,如不够则创建新的,没有上限
@return ExecutorService 接口类型引用

image-20200629141608484

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPool {
public static void main(String[] args) {
// 线程池引用 --> 指向Executors工具类(工厂类)
// 手动限定线程池中的固定数量
//ExecutorService es = Executors.newFixedThreadPool(3);

// 动态数量的线程池
ExecutorService es = Executors.newCachedThreadPool();

// 1.创建任务类对象
MyTask task = new MyTask();
// 2.将任务提交到线程池,由线程池调度、执行(谁先运行结束则优先被复用)
es.submit(task);
es.submit(task);
es.submit(task);
es.submit(task);
es.submit(task);
es.submit(task);
}
}
// 线程任务
class MyTask implements Runnable {
public void run() {
int i = 0;
while (i++ < 10) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}

02-线程池
https://janycode.github.io/2016/04/28/02_编程语言/01_Java/01_JavaSE/05_并发和锁/02-线程池/
作者
Jerry(姜源)
发布于
2016年4月28日
许可协议