多线程技术的出现大大提升了程序的处理性能,但是过多的线程一定会带来线程资源调度的损耗(例如:线程的创建与回收),这样就会导致程序的响应速度变慢。为了实现合理的线程操作,就需要提高线程的可管理型,并且降低资源损耗,所i有在JUC中提供了线程池的概念。线程池的创建可以通过java.util.concurrent.Executors类完成。Executors类能够创建的线程池一共有4种:
- 缓存线程池(CacheThreadPool):线程池中的每个子线程都可以进行重用,保存了所有的用户线程,并且随着处理量的增加可以持续进行用户线程的创建。
- 固定大小线程池(FixedThreadPool):保存所有的内核线程,这些内核线程可以被不断重用,并且不保留任何的用户线程。
- 单线程池(SingleThreadPool):只维护一个内核线程,所有执行者依据顺序排队获取线程资源。
- 定时调度池(ScheduleThreadPool):按照计划周期性地完成线程中的任务,包含内核线程与用户线程,可以提供有许多的用户线程。
多线程的实现本身依赖于操作系统,但同时也依赖于所使用的平台。例如:JDK最初发展的时候只有单核CPU,所以当时就依赖于软件平台实现。用户线程和内核的区别如下:
- 用户线程可以在不支持多线程的系统中存在,内核线程需要操作系统与硬件系统的支持。
- 在只有用户线程的系统中,CPU调度依然以进程为单位,处于运行进程中的多个线程是通过程序实现轮换执行;而在内核支持的多线程系统中,CPU调度以线程为单位,并由操作系统调度。
- 用户线程通过进程划分,一个进程系统只会为其分配一个处理器,所以用户线程无法调用系统的多核处理器,而内核线程可以调度一个程序在多核处理器上执行,提高处理性能。
- 用户线程执行系统指令调度时将导致其所属进程被中断,而内核线程执行系统指令调用时,只导致该线程被中断。