Java并发编程学习三:线程池
一、线程池简介
1. 为什么要用线程池
未使用线程池时,需要手动创建线程。当需要执行的任务很多时,需要创建很多的线程去处理。如果采用这种方式,会有以下问题:
- 反复创建线程系统开销比较大,每个线程创建和销毁都需要时间,如果任务比较简单,那么就有可能导致创建和销毁线程消耗的资源比线程执行任务本身消耗的资源还要大。
- 过多的线程会占用过多的内存等资源,还会带来过多的上下文切换,同时还会导致系统不稳定
那任务很多的时候该怎么办呢?不创建这么多线程,都在主线程串行执行,那效率也太低了。这时候,就需要使用线程池了。
线程池解决上述问题的思路是:
- 针对反复创建线程开销大的问题,线程池用一些固定的线程一直保持工作状态并反复执行任务
- 针对过多线程占用太多内存资源的问题,解决思路更直接,线程池会根据需要创建线程,控制线程的总数量,避免占用过多内存资源
2. 如何使用线程池
/**
* 描述: 用固定线程数的线程池执行10000个任务
*/
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10000; i++) {
service.execute(new Task());
}
System.out.println(Thread.currentThread().getName());
}
static class Task implements Runnable {
public void run() {
System.out.println("Thread Name: " + Thread.currentThread().getName());
}
}
}
如上所示,创建一个线程池,线程池中有 5 个线程,然后线程池将 10000 个任务分配给这 5 个线程,这 5 个线程反复领取任务并执行,直到所有任务执行完毕,这就是线程池的思想