7---绕不开的多线程

Posted on 2022-07-12 13:36  写程序到老  阅读(150)  评论(0编辑  收藏  举报

所有应用都是多线程了。。。然后就有了线程池,有效的管理有限个线程,重复应用,回收使用,不然每一个任务都新建一个线程,那就很快导致资源用完应用崩溃。

多线程 线程池--

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任务有接口返回  任务需要线程、线程池来执行

 

线程池涉及的知识点就这么多了。

 

Copyright © 2024 写程序到老
Powered by .NET 8.0 on Kubernetes