java四大线程池
来源:互联网 发布:淘宝运营课程 编辑:程序博客网 时间:2024/05/22 14:47
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
new Thread 的弊端
首先看一段代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
先说一下此处的打印,第一个参数是当前线程名称,由于线程之间是异步执行,有的还没创建好,有的后来居上就执行完了,导致打印线程的名称会这样,第二个参数是优先级,默认都是5,第三个参数是线程组名称。
如果不停止程序,这段代码会不断创建和销毁线程,直到死机或者OOM,更尴尬的是此处的线程,还无法主动去中断。
上述的线程启动方式在日常开发中经常看到的,但是从性能和优化的角度来说,问题还真不小。
- 每次都新建,性能较差(这个在线程池原理中有详细讲解)。
- 线程缺乏统一管理,可能无限制的创建线程,互相竞争,会带来一些不必要的麻烦。
- 可控性太差,比如定时定期执行,比如线程中断机制。
线程池的优点
java提供了四大线程池,主要针对new Thread的弊端讲述优点:
- 降低资源消耗,不需要每次都是新建和销毁,性能得到了提高。
- 统一管理,可有效控制最大并发量,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
- 可控性很好,可以定期定时执行、线程中断机制等。
newCachedThreadPool
newCachedThreadPool:创建带有缓存的线程池。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
由此可见,上述线程在新建的同时,还有部分线程被回收后再利用,刚刚做了下测试,在每次打印之前加了2ms的延迟,打印的都是“Thread[pool-1-thread-1,5,main]”。
线程池为无限大(其实是Interger. MAX_VALUE),当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
此处配置最大的线程长度是3,由打印可看出,此处始终在三个线程中执行。
newScheduledThreadPool
newScheduledThreadPool:支持定时和周期性执行的线程池。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
此方法无论任务执行时间长短,都是当第一个任务执行完成之后,延迟指定时间再开始执行第二个任务。
在日常开发中,newScheduledThreadPool可以作为timer的替代品,对比timer,newScheduledThreadPool更安全更强大。
newSingleThreadExecutor
newSingleThreadExecutor:从名称上便可以看出,此线程池是一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序。如果这个线程异常结束,会有另一个取代它,保证顺序执行。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
得到的结果会一直是“Thread[pool-1-thread-1,5,main]”。
总结:对于任务量少或者只有一个任务的情况下,此时使用线程池显得高射炮打蚊子了,但是对于任务量多,单个任务处理的时间比较短的情况下,你会对线程池有不一样的体会和好感。
- java四大线程池
- java四大线程池
- java四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- 四大线程池详解
- java的四大作用域及线程的生命周期
- Java se四大块之线程(上)
- java se 四大块 之线程(下)
- CLR线程池教程四大功能详解(1)
- CLR线程池教程四大功能详解(2)
- Android—四大线程池的使用介绍
- python各种模块的安装
- sql之列别名
- Android零基础入门第62节:搜索框组件SearchView
- 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
- 第一行代码 开始创建一个activity
- java四大线程池
- 极化码小结(1)
- 2017第二十四届国际广告新媒体新技术新设备新材料展示交易会会刊(参展商名录)
- Spark MLlib LDA 源码解析
- chrome开发者工具调试&移动端调试
- 【2017沈阳网络赛】1004 hdu6197 array array array 最长不下降子序列
- 简要谈谈PC启动的UEFI引导
- arch/arm/kernel/psci.c:287:12: error: redefinition of 'psci_init'
- 开始写关于unity的学习