线程池
为什么用线程池:
第一:降低资源消耗。 线程的创建和销毁的开销是巨大的。线程调度导致上下文切换也会有开销。并且一个系统所能够创建的线程总是受限于该线程拥有的处理器数目。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用。 线程池可以提供定时、定期、单线程、并发数控制等功能。比如通过ScheduledThreadPool线程池来执行S秒后,每隔N秒执行一次的任务。
第四:控制线程池的并发数可以有效的避免大量的线程池争夺CPU资源而造成堵塞。
没有必要每次都创建,因为run方法都是一样的。创建太多CPU来不及切换。
四种创建线程池的方式:
- newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。