线程池
1. 背景
- 创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程
- 控制并发的数量,并发数量过多可能会导致资源大量消耗而造成崩溃
- 可以对线程做统一管理
2. 思路
提前创建好多个线程并放入线程池中,使用时直接获取,用完再放回池中。这样可以避免频繁的创建销毁、实现重复利用。类似生活中的公交工具。
3. 好处
- 提高相应速度,减少了创建新线程的时间
- 降低资源消耗,重复利用线程池中线程,不需要每次都创建
- 便于线程管理
-
corePoolSize
:核心线程数最大值 -
maximumPoolSize
:最大线程数 -
keepAliveTime
:非核心线程没有任务时最多保持多长时间 -
unit
:keepAliveTime
的单位 -
workQueue
:阻塞队列,维护着等待执行的Runnable
对象
-
4. 使用
- JDK5 后提供了线程池相关 API:
ExecutorService
和Executors
-
ExecutorService
:真正的线程池接口,常见子类为ThreadPoolExecutor
-
void execute(Runnable command)
:执行任务,没有返回值,一般用来执行Runnable
-
<T> Future<T> submit(Callable<T> task)
:执行任务,有返回值,一般用来执行Callable
-
void shutdown()
:关闭连接池
-
-
Executors
:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
例:
public class TestPool {
public static void main(String[] args) {
// 1. 创建服务,创建线程池
// newFixedThreadPool 参数为线程池大小
ExecutorService service = Executors.newFixedThreadPool(10);
// 执行
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());
// 2. 关闭连接
service.shutdown();
}
}
class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}