Java线程池

线程池是什么?解决什么问题的?

管理线程的工具。

什么时候,什么场合才适合用。

昨天已经在AOP的时候有提出。

为什么要用这个东西?

为了解决不断地开启新线程的问题来使用。

如何使用,步骤和注意细项是什么。

使用方式一:

JDK直接提供。但是不复现实情况。

带缓存线程池 static ExecutorService newCachedThreadPool()

固定大小线程池 static ExecutorService newFixedThreadPool(int nThreads)

单线程线程池 static ExecutorService newSingleThreadExecutor()

自定义:

corePoolSize,线程池中的核心线程数

maximumPoolSize,线程池中的最大线程数

keepAliveTime,空闲时间,当线程池数量超过核心线程数时,多余的空闲线程存活的时间,即:这些线程多久被销毁。

unit,空闲时间的单位,可以是毫秒、秒、分钟、小时和天,等等

workQueue,等待队列,线程池中的线程数超过核心线程数时,任务将放在等待队列,它是一个BlockingQueue类型的对象

threadFactory,线程工厂,我们可以使用它来创建一个线程

handler,拒绝策略,当线程池和等待队列都满了之后,需要通过该对象的回调函数进行回调处理

缓冲队列BlockingQueue简介:

ArrayBlockingQueue,队列是有界的,基于数组实现的阻塞队列

LinkedBlockingQueue,队列可以有界,也可以无界。基于链表实现的阻塞队列

SynchronousQueue,不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作将一直处于阻塞状态。该队列也是Executors.newCachedThreadPool()的默认队列

PriorityBlockingQueue,带优先级的无界阻塞队列

拒绝策略-handler

所谓拒绝策略,就是当线程池满了、队列也满了的时候,我们对任务采取的措施。或者丢弃、或者执行、或者其他...

jdk自带4种拒绝策略,我们来看看。

  1. CallerRunsPolicy // 在调用者线程执行

  2. AbortPolicy // 直接抛出RejectedExecutionException异常

  3. DiscardPolicy // 任务直接丢弃,不做任何处理

  4. DiscardOldestPolicy // 丢弃队列里最旧的那个任务,再尝试执行当前

提交任务的几种方式

往线程池中提交任务,主要有两种方法,execute()submit()

execute()用于提交不需要返回结果的任务,我们看一个例子。

submit()用于提交一个需要返回果的任务。该方法返回一个Future对象,通过调用这个对象的get()方法,我们就能获得返回结果。

线程池监控

如果系统中大量用到了线程池,那么我们有必要对线程池进行监控。利用监控,我们能在问题出现前提前感知到,也可以根据监控信息来定位可能出现的问题。

那么我们可以监控哪些信息?又有哪些方法可用于我们的扩展支持呢?

首先,ThreadPoolExecutor自带了一些方法。

  1. long getTaskCount(),获取已经执行或正在执行的任务数

  2. long getCompletedTaskCount(),获取已经执行的任务数

  3. int getLargestPoolSize(),获取线程池曾经创建过的最大线程数,根据这个参数,我们可以知道线程池是否满过

  4. int getPoolSize(),获取线程池线程数

  5. int getActiveCount(),获取活跃线程数(正在执行任务的线程数)

其次,ThreadPoolExecutor留给我们自行处理的方法有3个,它在ThreadPoolExecutor中为空实现(也就是什么都不做)。

  1. protected void beforeExecute(Thread t, Runnable r) // 任务执行前被调用

  2. protected void afterExecute(Runnable r, Throwable t) // 任务执行后被调用

  3. protected void terminated() // 线程池结束后被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值