什么是线程池
为了避免系统频繁地创建和销毁线程,可以让创建的线程进行复用。线程池中,有几个活跃的线程,当你需要的线程时候,可以从线程池中哪一个空闲线程。使用完毕后,不关闭这个线程,而是把线程还回线程池。
简单来说,在使用线程池后,创建线程变成了从线程池获得空闲线程,关闭线程变成了向线程池归还线程。
JDK对线程池的支持
JDK提供了Executor框架,帮助我们有效地进行线程控制,Executor框架本质是一个线程池。
ThreadPoolExecutor表示一个线程池,Executors是线程池工厂类,通过Executors可以获得一个拥有特定功能的线程池。ThreadPoolExecutor类实现了Executor接口,因此通过这个接口,任何Runnable的对象都可以被ThreadPoolExecutor线程池调度。
Executors提供了各种类型的线程池,主要有以下几种工厂方法:
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newSingleThreadExecutor()
public static ExecutorService newCachedThreadPool()
public static ScheduledExecutorService newSingThreadScheduledExecutor()
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
newFixedThreadPool():该方法返回一个固定线程数量的线程池,该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会暂时存在一个任务队列中,等待有线程空闲时,便处于任务队列中的任务。
newSingleThreadExecutor():返回一个只有一个线程的线程池。先入先出的顺序执行任务。
newCachedThreadPool():返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量并不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。若没有空闲线程,又有新的任务被提交,则会创建新的线程处理任务。所有的线程在执行完任务之后,就会返回线程池进行复用。
newSingleThreadScheduledExecutor():返回的线程池只有一个线程,实现可在给定时间执行某项任务的功能。如在某个固定的延时之后执行,或者周期性地执行某个任务。
newScheduledThreadPool():也返回ScheduledExecutorService对象,但该线程池可以指定线程数量。
计划任务
newScheduledThreadPool()返回一个ScheduledExecutorService对象,可以根据时间需要对线程进行调度。与其他线程池不同,ScheduledExecutorService并不一定会立即安排执行任务,它其实是起到了计划任务的作用。
它会在指定时间,对任务进行调度。
//ScheduledExecutorService主要方法如下
//在给定的时间,对任务进行一次调度
public ScheduledFuture<?> schedule(Runnable command,long delay,TimeUnit unit)
//下面两个方法会对任务进行周期性的调度
public ScheduledFuture<?> scheduleAtFixedRate(Runable command,
long initialDelay,
long period,
TimeUnit unit)
public ScheduledFuture<?> scheduleWithFixedDelay(Runable command,
long initialDelay,
long period,
TimeUnit unit)
