目录
线程池
多线程存在的问题:
一个线程大约占1mb的内存,大量的创建线程会导致内存溢出
线程在执行完run方法后,会等到系统回收,会导致内存浪费
频繁的创建和回收线程,会导致资源的浪费
解决方案:
线程池
线程池作用:
管理线程,创建,复用,销毁等
线程池本质:
容纳多个线程的容器
线程池体系:
Executor(接口)
提供的方法:
void execute(Runnable command):执行线程任务
boolean isShutdown();判断线程次是否关闭
Future<?> submit(Runnable task):给线程池提交线程任务
Future<?> submit(Callable<?> task ):给线程池提交线程任务
子接口:
ScheduledExecutorService(调度线程池)
提供的方法:ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
command:线 程 任 务
initialDelay:延 迟 时 间
period:间 隔 时 间
注 意 :
下 一 次 任 务 开 始 时 间 -上 一 次 任 务 开始 时 间 =间 隔 时 间
当 任 务 执 行 时 间 大 于 间 隔 时 间 ,下 一次 任 务 将 会 在 上 一 次 任 务 结束后 ,立 即 执 行
unit:时 间 单 位
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long,initialDelay,
long delay,TimeUnit unit)
command:线 程 任 务
initialDelay:延 迟 时 间
period:间 隔 时 间
注 意 :
下 一 次 任 务 开 始 时 间 -上 一 次 任 务 结束 时 间 =间 隔 时 间
unit:时 间 单 位
子类:
ThreadPoolExecutor
构 造 函 数 :
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize:核 心 线 程 数
maximumPoolSize:最 大 线 程 数
keepAliveTime:线 程 回 收 时 间
unit:时 间 单 位
workQueue:存 储 线 程 任 务 的 队 列
threadFactory:线 程 工 厂
handler:算 法
线程池使用步骤:
1,创 建 线 程 池
2,提 交 任 务
3,关 闭 线 程 池 ,注 意 抢 占 线 程 池 中 的 线 程 默 认 为 守 护 线 程
Executors
作用:
创建线程池
提供的方法:
static ExecutorService newFixedThreadPool(int nThreads):创建固定线程池
static ExecutorService newSingleThreadExecutor():创建单例线程池
static ExecutorService newCachedThreadPool():创建可变线程池
static ScheduledExecutorService newSingleThreadScheduledExecutor():创建单例调度线程池
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize):创建调度线程池
static ExecutorService newWorkStealingPool(int parallelism):创建抢占线程池
Callable
问题:
Runnable无法返回接口数据
解决方案:
使用Callable
注意:
只能给线程池使用
Callable和Runnable的区别:
Callable提 供 call方 法 ,有 返 回 值
Runnable提 供 run方 法 ,没 有 返 回 值
Future
作用:
获取线程任务对象的返回值
方法:
V get()
注 意 :
会 阻 塞 当 前 线 程 ,直 到 对 应 的 线 程 任 务 执 行 完 毕 后 ,获 取 其 返 回 值
Lock
作用:
替换synchronized
体系:
Lock(接 口 )
提 供 的 方 法 :
void lock():锁
void unLock():开 锁
子 类 :
提 供 的 方 法 :
ReentrantLock:重 入 锁
ReentrantReadWriteLock:读 写 锁
提 供 的 方 法 :
Lock readLock();获 取 读 锁
Lock writeLock():获 取 写 锁
注 意 :
读 -读 不 互 斥
读 -写 互 斥
写 -写 互 斥
经 验 :
读 里 面 用 读 锁
写 里 面 用 写 锁