程序中线程过多会导致程序的性能和稳定性都下降,为了避免无限制地创建线程,使用线程池技术。
线程池中线程的数量是有限的,有新的任务,就把任务封装成runnable对象,交给线程池中的线程去执行,一个线程执行完某个任务之后,就可以马上去执行下一个任务。
线程池中的线程数量可以是固定大小的,也可以是弹性伸缩的。
多线程适用于IO密集型的程序,而不适用于计算密集型的程序。
java并发包:
JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持。
原子量:保证各个线程看到的数据是同一个版本。
线程池的5种创建方式:
1、 Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行,
代码: Executors.newSingleThreadExecutor()
2、 Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除,
代码:Executors.newCachedThreadPool()
3、 Fixed Thread Pool : 拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,
代码: Executors.newFixedThreadPool(4)
在构造函数中的参数4是线程池的大小,你可以随意设置,也可以和cpu的核数量保持一致,获取cpu的核数量int cpuNums = Runtime.getRuntime().availableProcessors();
4、 Scheduled Thread Pool : 用来调度即将执行的任务的线程池(是不是立即执行, 过多久执行,每隔多久执行一次... )
代码:Executors.newScheduledThreadPool()
5、 Single Thread Scheduled Pool : 只有一个线程,用来调度任务在指定时间执行
代码:Executors.newSingleThreadScheduledExecutor()