1.Java线程池
Java通过Executors提供四种线程池,分别为:
- newSingleThreadExecutor创建一个单线程池,线程池中只有一个线程,必须要等待执行完一个任务,才能执行下一个任务
- newFixedThreadPool创建一个固定大小的线程池,支持定时及周期性任务执行。
- newCachedThreadPool创建一个可缓存线程的线程池,可以根据任务数量去创建线程个数
- newScheduledThreadPool创建一个可执行延时任务的线程池,本质上是固定线程个数的线程池,可以执行延时任务
1.newSingleThreadExecutor:
创建一个单线程池,线程池中只有一个线程,必须要等待执行完一个任务,才能执行下一个任务,示例代码如下:
在单线程池中,必须要等上一个任务执行完成才能开始执行下一个任务,在此期间不会创建第二条线程。sleep方法是让线程休眠一秒钟。
线程运行五个任务但是只会有一条线程。
2.newFixedThreadPool:
创建一个固定大小的线程池,支持定时及周期性任务执行。示例代码如下:
比如说我创建了五个线程但是任务有八个,这个时候就先执行前面五个任务,等有空余的再接着执行剩下的三个任务。直到任务全部执行完成。
先有五个线程开始执行五个任务,然后再等着五个任务有先执行完的运行接下来的三个任务。
3.newCachedThreadPool:
创建一个可缓存线程的线程池,可以根据任务数量去创建线程个数,示例代码如下:
现在一个有五个任务在执行的时候就会创建五个线程,通俗来是就是有几个任务就创建几个线程,这就是可缓存线程的线程池。
有五个任务就创建了五条线程开始执行这五个任务。
4.newScheduledThreadPool:
创建一个可执行延时任务的线程池,本质上是固定线程个数的线程池,可以执行延时任务,示例代码如下:
表示延迟2秒之后再执行。
每过两秒执行一次。
为什么要用线程池:
- 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
- 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。