为了实现在并发环境下异步执行任务,我们会使用线程,为了避免频繁创建和销毁线程带来资源消耗,我们会用到线程池。
下面介绍Jdk的4种线程池并配以代码测试:
先定义一个线程类
1)定长线程池:FixedThreadPool
每来一个新的任务,线程池首先判断池里的线程数量有没有达到设定值,如果没有,则会创建一个新的线程,如果已经达到了设置值,线程池会再去判断池中有没有空闲的线程,有则使用,没有的话,新来的任务则会在队列里排队。
测试代码:
运行结果:
2)缓存线程池:CachedThreadPool
每来一个新的任务,线程池首先判断池里有没有空闲的线程,有则重用,没有则创建新的线程。如果一个线程在池里空闲了N秒(默认60S)而没有被重用,将会被线程池移除,释放资源。
源码中这样注释:
为什么非常适用于“短期任务”?
因为short-lived的任务才会很快执行完,线程才会空闲出来,新来的任务才会去重用空闲的线程,否则线程池就会不断地去创建新的线程,或者造成排队等待的任务越来越多,造成服务器压力越来越大。
测试代码:
线程池里只有一个线程,反复使用
测试代码:
可以延迟并周期性执行任务的线程池,对于同一个任务在周期性执行时,不一定用的都是同一个线程,线程池每次在执行任务时,只会优先重用空闲的线程。
测试代码:
联系客服