美文网首页JAVA 高级
并发编程艺术-9

并发编程艺术-9

作者: e86dab508bc1 | 来源:发表于2018-04-26 01:02 被阅读0次

    本文主要介绍了java 中的线程池。

    1. 线程池的好处:
      (1)降低资源的消耗:利用已创建的线程降低创建和销毁的消耗
      (2)提高响应时间,建立在(1) 的基础上
      (3)提高线程的可管理性

    2. 线程池工作流程 :
      提交一个新的任务之后
      (1) 判断核心线程池里面是否都在执行任务,一种情况是线程池刚启动,里面的核心线程还没有达到预设的数量,则创建核心线程池,并把任务提交给核心线程执行,还有一种情况是,核心线程池里面有核心线程当前处于闲置状态,则提交任务给其运行,上述两种情况都不满足的情况下,则核心线程池已满,处于运行状态。进入下一步判断

    (2)判断队列是否已满,如果没满,则任务进入工作队列,否则进入下一步。

    (3) 判断线程池是否都已经处于工作状态,如果都是,则交给饱和策略,否则创建新线程执行任务。


    1. 执行示意图 :

    4.线程池关键点介绍
    阻塞队列部分介绍:
    (1) BlockingQueue:

    ArrayBlockingQueue: 基于数组,先进先出排序。

    LinkedBlockingQueue:基于队列。

    SynchronizedQueue:不存储元素的阻塞队列,每一个插入操作必须等待另外一个线程移除操作,否者插入操作一直处于阻塞状态。

    PriorityBlockingQueue:具有优先级。

    (2) RejectExecutionHandler :

    AbortPolicy: 直接跑出异常

    DiscardPolicy:不处理丢掉

    CallerRunsPolicy:只用调用者所在的线程来运行任务。

    DiscardOldestPolicy: 丢弃队列中最近的一个任务,并执行当前任务。

    (3) 提交方式:

    submit() : 提交有返回值的任务
    excute() : 提交没有返回值得任务

    (4) 关闭线程池:

    shutdown(): 将状态设置成shutdown 状态,中断所有没有正在执行任务的线程。

    shutdownNow():将状态设置成STOP状态,并且尝试停止所有的线程,并返回等待执行任务的列表。

    (5)如何合理分配线程池线程数量:

    N 代表CPU
    IO密集型:线程数为 N * 2

    CPU 密集型:N+1

    混合型:尽可能地拆分乘CPU密集型和IO密集型。

    有时候还需要关注 任务的优先级以及 是否依赖于其他的系统资源。

    (6) 线程池监控。

    taskCount: 线程池中运行任务的数量。

    completedTaskCount : 运行过程中已完成的任务数量。
    等等。

    相关文章

      网友评论

        本文标题:并发编程艺术-9

        本文链接:https://www.haomeiwen.com/subject/cnsslftx.html