【多线程】Executor

本文详细介绍了Java中的Executor框架,包括Executor接口、ThreadPoolExecutor和ScheduledThreadPoolExecutor的使用,以及FutureTask的异步计算。讨论了线程池的构造和工作原理,如FixedThreadPool、SingleThreadExecutor和CachedThreadPool。此外,还涵盖了ScheduledThreadPoolExecutor如何执行周期任务,以及FutureTask的get()和cancel()方法。
摘要由CSDN通过智能技术生成

一、Executor框架

工作单元 Runnable Callable

执行机制 Executor框架

两级调度模型

应用分解为若干个任务

上层,Executor框架控制,这些任务映射为固定数量的线程

底层,操作系统内核控制,线程映射到硬件处理器

补充:

任务是一组逻辑工作单元

线程是使任务异步执行的机制

有界队列防止高负荷的应用程序耗尽内存

public interface Executor{
   
	void execute(Runnable command);
}

将任务的的提交与执行解耦,并用Runnable表示任务

public class ThreadPerTaskExecutor implements Executor{
   
	public void execute(Runnable r){
   
		new Thread(r).start();
	}
}

框架结构

任务:Runnable接口或Callable接口

任务的执行:ThreadPoolExecutor和ScheduledThreadPoolExecutor

异步计算的结果:FutureTask类

说明:

Executor接口:分离任务的提交与执行

ThreadPoolExecutror:执行被提交的任务

ScheduledThreadPoolExecutor:给定延迟后或定期执行命令

使用:

create Runnable或Callable 的任务对象

Executors.callable( Runnable task) 封装为Callable对象

ExecutorService.execute( Runnable task) 交给执行

ExecutorService.submit( Callable task) 提交执行

因为submit返回FutureTask对象

所以可以直接创建FutureTask,交给ExecutorService执行

FutureTask.get() 等待任务执行完成

FutureTask.cancel() 取消此任务的执行

框架成员

1、ThreadPoolExecutor,工厂类Executors创建

1)固定线程数 FixedThreadPool

限制当前线程数量

2)单个线程 SingleThreadPool
保证顺序执行任务,且同一时间内不会有多个线程活动

3)根据需要创建 CachedThreadPool

执行很多的短期异步任务的小程序,服务器负载较轻

2、ScheduledThreadPoolExecutor

1)ScheduledThreadPoolExecutor 多个执行,限制数量

2)SingleThreadPoolExecutor 单个执行,顺序执行

3、 Future submie()

4、Runnable不会返回结果,Callable会返回结果

Callable callable(Runnable task, T result)

Callable callable(Runnable task)

补充:

Fixed: 固定长度,每提交一个任务就创建一个线程,达到最大数量,规模不再变化,Exception会补充新的线程

Cached: 可缓存,当前规模超过处理需求,回收空闲线程,需求增加时新建,不受规模限制

SIngle: 单线程,异常就创建新的,任务串行执行(FIFO, LIFO, 优先级)

Scheduled: 固定长度,延迟或定时执行

二、ThreadPoolExecutor

线程池的实现类,

四个组件:

corePool 核心线程池的大小

maximumPool 最大线程池的大小

BlockingQueue 工作队列:暂时保存任务

RejectedExecutionHandler 关闭或饱和时的方法

饱和:达到最大且工作队列已满

RejectedExecutionHandler.rejectedExecution()

1、FixedThreadPool 可重用固定线程数

核心与最大都是创建参数

keepAliveTime 为空闲线程等待新任务的最长时间,超时终止线程

少于核心,创建新线程

等于核心,任务加入工作队列

执行完任务,循环反复从工作队列中获取任务

LinkedBlockingQueue 无界队列Integer.MAX_VALUE

新任务在工作队列中,线程数不会超过核心

最大和keepAliveTime为无效参数,不会拒绝任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值