18.JDK线程池概述

什么是线程池

       为了避免系统频繁地创建和销毁线程,可以让创建的线程进行复用。线程池中,有几个活跃的线程,当你需要的线程时候,可以从线程池中哪一个空闲线程。使用完毕后,不关闭这个线程,而是把线程还回线程池。

       简单来说,在使用线程池后,创建线程变成了从线程池获得空闲线程,关闭线程变成了向线程池归还线程。


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)                             
      对于FixedRate来说,任务调度的频率是一定的,它是以上一个任务开始执行时间为起点,之后的period时间,再调度下一个任务。而FixedDelay是在上一个任务结束之后,再经过delay时间进行任务调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值