所有应用都是多线程了。。。然后就有了线程池,有效的管理有限个线程,重复应用,回收使用,不然每一个任务都新建一个线程,那就很快导致资源用完应用崩溃。
多线程 线程池--
Java中的多线程机制 Executor框架
框架成员:
1:Executors:工厂类 生产ThreadPoolExecutor ScheduledThreadPoolExecutor ,还可以转Runnbale为Callable
2:ThreadPoolExecutor:框架核心 主要属性:核心线程数量 最大线程数 暂存任务的工作队列 拒绝策略(如果池子满了 或者说没有线程可供使用了 该怎么办)keepAliveTime
为0L 空闲线程立即终止
有三种 : 1个的 固定值的 无限的
FixedThreadPool:限制线程数量 实现资源管理 适合负载重的服务器 创建时要提供一个池子大小的值,那么核心池和最大池线程数都是这个值
特别注意:这里使用无界队列LinkedBlockingQueue作为工作队列,线程只要到核心数就不会再加了 因为任务都到队列里了,最大池无效,空闲等待时间也无效,
无拒绝策略。
SingleThreadExecutor:单线程 任务都是顺序执行 不会有多个线程同时进行 设为1的FixedThreadPool
CachedThreadPool:无界的线程池 适合执行多但小的任务 适合负载轻一些的服务器 根据需要创建新线程 核心为0 最大为Integer.MAX_VALUE无界
等待是60L 60秒终止闲线程 没有容量的SynchronousQueue 作为工作任务队列 想一下 主线不停的提交任务,速度比池里的线程处理快,那就会不停的创建新线程
直到资源耗尽 没有容量那怎么放呢?主线程提交任务 线程池拿任务 有提交了 线程也在拿 这就对上了 。提交了 没有线程来拿,那创建新线程拿这个任务。
3:ScheduledThreadPoolExecutor:继承ThreadPoolExecutor 有两种 延时执行任务 Timer是一个后台线程的执行任务
DelayQueue 又一个无界工作队列 最大池无效了 封装了一个PriorityQueue 会对队列中的任务进行排序 time 排前面 然后序号排
ScheduledFutureTask 实现RunnableScheduledFuture 这是放在队列的中的任务:三个成员变量控制任务执行
time:任务执行时间
sequeueceNumber:被添加到池的序号
period:执行任务的间隔周期
线程池取队列中的任务然后执行
ScheduledThreadPoolExecutor:若干个线程 多个线程执行后台任务
SingleThreadScheduledExecutor:一个线程 单个线程执行的周期任务 顺序执行
4:Future 是个接口 实现类 FutureTask 异步计算的结果 有些任务提交给线程池会返回这个对象。get()会等任务执行完拿到结果
FutureTask还实现了Runnable接口 我们主要使用的是线程池执行完任务返回值 我们使用FutureTask来接收 调用get方法 会阻塞线程,这里涉及到一个AQS,有兴趣可
以仔细研究一下。
5:Runnable Callable接口 任务: Runnbale任务没有结果返回 Callbale任务有接口返回 任务需要线程、线程池来执行
线程池涉及的知识点就这么多了。
本文来自博客园,作者:写程序到老,转载请注明原文链接:https://www.cnblogs.com/angin-iit/p/16469174.html