线程池
线程相关类、集合
16、线程池
Why? 系统启动一个新线程的成本比较高,因为涉及到与操作系统交互。这个时候用线程池可以很好的提高性能,
尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
原理:(流程)线程池和数据库连接池有点类似的是,线程池在系统启动时创建大量空闲线程,程序将一个Runnable对象传给线程池,
线程池就会启动一条线程来执行该线程对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲线程,
等待执行下一个Runnable对象的run方法。
优点:使用线程池可以有效的控制系统中并发线程的数量,当系统中包含大量的并发线程时,会导致系统性能剧烈下降,
甚至导致JVM的崩溃,而线程池的最大线程参数可以控制系统中并发线程数目不超过此数目。
在JDK1.5开始,提供Java内建的线程池,JDK提供一个Executors工厂类来产生线程池,该工程类包含如下几个静态工厂方法来创建连接池:
A、newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。
B、newFixedThreadPool(int nThreads):创建一个可重用的、具有固定线程数的线程池
C、newSingleThreadExecutor():创建一个只有单线程的线程池,它相当于newFixedThreadPool方法传递参数1
D、newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以在指定延迟后执行线程任务,
corePoolSize 指池中所保持的线程数,即使线程是空闲的也被保存在线程池内。
E、newSingleThreadScheduiedExecutor():创建只有一条线程的线程池,它可以在指定延时后执行线程任务。
以上5个方法的前三个方法返回的是一个ExecutorService对象,该对象代表一个线程池,它可以执行Runnable对象或Callable对象所代表的线程。
而后两个方法返回一个ScheduledExecutorService线程池,它是ExecutorService的子类,它可以在指定延时后执行线程任务。
ExecutorService代表尽快执行线程的线程池(只要线程中有空闲的线程就立即执行线程任务)。
程序只要将一个Runnable对象或Callable对象(代表线程任务)提及给该线程池即可,该线程池就会尽快的执行任务。
ExecutorService里提供如下3个方法:
A、Future