在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题,于是找了下API看到Java提供四种线程池使用,Java通过Executors提供四种线程池,分别为:
1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4、newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
下面使用Java代码看一下使用:
(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。Java示例代码:
执行后可以看到效果,固定了线程数为4 ,打印4个数字后会休眠5s后再次打印4个数字。
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。示例:
这样就延迟了5秒执行操作。
(4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,示例:
这样执行代码后,会使用一个线程一次打印出0 1 2 3 4 间隔5s。
线程池的好处:
1.减少在创建和销毁线程上所花的时间以及系统资源的开销 。
2.避免了造成系统创建大量线程而导致消耗完系统内存。
总结: FixedThreadPool是一个优秀的线程池,使用时需要注意当线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源;CachedThreadPool线程池,当没有任务执行时,会释放调,当有任务时,又要创建,需要 消耗系统开销,而且在大量并发执行时,需要注意控制任务量,避免大量高并发导致系统问题。