美文网首页
线程以及java线程池实现分享

线程以及java线程池实现分享

作者: codingdd | 来源:发表于2015-05-12 16:06 被阅读0次

    线程以及java线程池实现分享

    1. 线程简介
    2. JDK线程池的工作原理
    3. JDK线程池的实现细节

    1.线程简介-由来

    1.进程

    process_m.png
    ****缺点****
    1.性能,大量CPU与I/O操作
    2.创建需要大量资源

    2.线程模型

    user_thread_1.png

    3.线程实现--用户线程

    user_thread_3.png

    1.调度灵活,可定制高度算法
    2.并不能完全解决阻塞问题

    4.线程实现--内核线程

    kernel_thread.png

    5.Java线程例子

    1.PS

    ps.png

    2.查看线程堆栈

    jstack.png

    3.查看所有线程

    pself.png

    POSIX标准

    可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。

    POSIX线程标准
    Linux系统从2.6版本开始使用了一套实现了POSIX线程标准的库-NPTL(native posix thread library)

    2. JDK线程池的工作原理

    线程池的主要功能部件

    1. 队列(不同的队列实现)
    2. ThreadFactory
    3. 多个线程(主要参数:corePoolSize,maximumPoolSize,keepAliveTime)
    threadpool.png

    工作流程

    1. 每个线程工作流程
    work.png
    1. 整体工作流程
    poolwork.png
    1. 队列

    直接提交
    工作队列的默认选项是 SynchronousQueue,生产和消费,当无等待消费的worker时,生产一定失败。 newCachedThreadPool。

    queue.png

    无界队列
    使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;newFixedThreadPool newSingleThreadExecutor。
    有界队列
    当使用有限的 maximumPoolSizes时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。

    相关文章

      网友评论

          本文标题:线程以及java线程池实现分享

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