1. 为什么要使用线程池
来看一个常规的应用场景,假如有三个相同的任务需要执行,那么你必须得创建三个线程来执行这三个任务。
线程是不能复用的。
package LearnThreadPool;
import java.util.stream.IntStream;
/**
* 简单使用线程池
*
* @author cat
* @version 2025/2/24 16:08
* @since JDK17
*/
public class UseThreadPool {
public static void m() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
IntStream.range(0, 3).mapToObj(i -> (new Thread(UseThreadPool::m, "Thread-" + (i + 1)))).forEach(Thread::start);
}
}
输出 :
Thread-1
Thread-2
Thread-3
但如果你使用线程池的话,则不需要创建三个线程。
package LearnThreadPool;
import Chapter07.ThreadPool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.stream.IntStream;
/**
* 简单使用线程池
*
* @author cat
* @version 2025/2/24 16:08
* @since JDK17
*/
public class UseThreadPool {
public static void m() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
// 创建一个只有一个线程的线程池
ExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
IntStream.range(0, 3).forEach(i -> threadPool.execute(UseThreadPool::m));
// 关闭线程池
threadPool.shutdown();
}
}
输出 :
pool-1-thread-1
pool-1-thread-1
pool-1-thread-1
此时输出的三个线程的名称是一样的,这说明一个线程执行了三个任务,即实现了线程的复用。
2. 线程池的好处
- 降低资源消耗 : 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度 : 当有任务时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性 : 线程池可以进行统一的分配,调优和监控。
3. 什么是线程池
线程池是一种池化思想管理线程的工具。