线程池相关

 

 

接口:Executor,ExecutorService,ScheduledExecutorService

抽象类:AbstractExecutorService

类:ThreadPoolExecutor,ScheduledThreadPoolExecutor

 

1.分析ThreadPoolExecutor类

1.是线程池的真正实现(包含4个构造方法)

2.分析构造方法需要参数

corePoolSize:核心线程数,默认情况下这些线程会一直处于存活状态,即使处于闲置状态也不会受到keepAliveTime限制,如果当前线程数小于核心线程数,那么不管有没有空闲线程,都会给新的任务产生新的线程

maximumPoolSize:线程池能所容纳的最大线程数,超过这个数线程将被阻塞,放到workQueue中,如果当前线程数大于核心线程数,小于最大线程数,如果有空闲线程,那么使用空闲线程,如果没有就创建新的线程。 如果当前线程数等于最大线程数,如果有空闲线程,那么使用空闲线程,如果没有,放入workQueue中

keepAliveTime:表示线程没有任务后,保持多久后停止。如果当前线程数小于核心线程数,那么这个值没有意义,如果当前线程数大于核心线程数,那么当此线程没有任务该时间后,停止

Unit:keepAliveTime 的单位

workQueue :一个阻塞队列,用来存储等待执行的任务,当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待。通过workQueue,线程池实现了阻塞功能

workQueue的类型为BlockingQueue<Runnable>,通常可以取下面三种类型:

1>有界队列ArrayBlockingQueue:基于数组的先进先出队列,创建时必须指定大小

2>无界队列LinkedBlockingQueue:基于链表的先进先出队列,创建时不用指定大小,默认int最大值

3>直接提交队列:synchronousQueue,不会保存提交的任务,直接创建一个线程执行新来的任务

threadFactory :线程工厂,用来创建线程。

handler :表示当拒绝处理任务时的策略。当阻塞队列满了之后,还有源源不断的任务过来,此时服务器忙不过来,需要采取拒绝策略,ThreadPoolExecutor类中提供了以下四个方法,返回拒绝策略

1>AbortPolicy:队列满了,丢弃任务抛出异常(默认的拒绝策略)

2>DiscardPolicy:队列满了,直接丢弃任务,什么也不干

3>DiscardOldestPolicy:队列满了,丢弃最早进入队列的任务,之后尝试进入队列

4>CallerRunsPolicy:队列满了,用主线程执行任务,不单独启用线程

3.如何配置核心线程数和最大线程数

核心线程数:

核心线程数,看应用,如果是任务,一天跑一次,设置为0,合适,因为跑完就停掉了,如果是常用线程池,看任务量,是保留一个核心还是几个核心线程数

最大线程数:

一般来说如果是CPU密集型:线程池大小设置为N+1

如果是IO密集型:线程池大小设置为2N+1(因为io读数据或者缓存的时候,线程等待,此时如果多开线程,能有效提高cpu利用率)

最大线程数 = (线程等待时间+CPU处理时间)/CPU处理时间*CPU数量

什么是CPU密集型?IO密集型?

CPU密集型,也叫计算密集型,主要花费时间在于计算上,对于内存,硬盘效率较高

IO密集型,CPU较好,或者处理IO读写操作时间较多,主要花费时间在内存,硬盘读写上

2.分析ExecutorService接口

1.执行或者关闭线程池中的某个或多个线程接口类

包含下列重要方法

1>shutdown方法:关闭线程池方法,在关闭线程池之前,等待提交的任务完成之后关闭

2>shutdownNow方法:会阻止开启新任务,并且尝试停止当前执行的任务,然后关闭线程池

3>isShutdown方法:返回执行者是否已经关闭

4>isTerminated方法:如果关闭后所有任务都已完成,返回true,只有先调用shutdown或shutdownNow方法才返回true

3.分析ScheduledExecutorService接口

1.可调度的执行者服务接口 继承ExecutorService

2.包含如下四个方法

1>//指定时延后调度执行任务

public ScheduledFuture<?> schedule(Runnable command,

long delay, TimeUnit unit);

适用于延时单次执行的无返回值任务

2> //指定时延后调度执行任务

public <V> ScheduledFuture<V> schedule(Callable<V> callable,

long delay, TimeUnit unit);

适用于延迟单次执行的有返回值任务

3> //指定时延后开始执行任务,以后每隔period的时长再次执行该任务

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,

long initialDelay,

long period,

TimeUnit unit);

适用于延迟执行无返回值定时任务,延迟后开始,每隔period时间再次执行

4> //指定时延后开始执行任务,以后任务执行完成后等待delay时长,再次执行任务

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,

long initialDelay,

long delay,

TimeUnit unit);

适用于延迟执行无返回值定时任务,延迟后开始,执行完之后等待delay一段时间后再次执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值