zoukankan      html  css  js  c++  java
  • 《Java并发编程实战》第八章 线程池的使用 读书笔记


    一、在任务与运行策略之间的隐性解耦

    有些类型的任务须要明白地指定运行策略,包含:
    . 依赖性任务。依赖关系对运行策略造成约束。须要注意活跃性问题。

    要求线程池足够大,确保任务都能放入。
    . 使用线程封闭机制的任务。须要串行运行。


    . 对响应时间敏感的任务。


    . 使用ThreadLocal的任务。


    1. 线程饥饿死锁
    线程池中假设全部正在运行任务的线程都因为等待其它仍处于工作队列中的任务而堵塞。这样的现象称为线程饥饿死锁。


    2. 执行时间较长的任务
    Java提供了限时版本号与无限时版本号。

    比如Thread.join、BlockingQueue.put、CutDownLatch.await、Selector.select


    二、设置线程池的大小

    要正确地设置线程池的大小,你必须估算出任务的等待时间与计算时间的比值。这样的估算不须要非常精确。而且能够通过一些分析或监控工具来获得。

    公式定义:
    int N_CPUS = Runtime.getRuntime().availableProcessors();
    CPU并非唯一影响线程池大小的资源,还包含内存、文件句柄、套接字句柄和数据库连接等。

    计算每一个任务对该资源的需求量。然后用该资源的可用总量除以每一个任务的需求量,所得结果就是线程池大小的上限。


    三、配置ThreadPoolExecutor


    API文档中对构造函数的描写叙述:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              RejectedExecutionHandler handler)
    用给定的初始參数和默认的线程工厂创建新的 ThreadPoolExecutor。


    1. 线程池的创建与销毁
    能够查看Executors几个方法源代码来辅助理解ThreadPoolExecutor參数的配置。


    2. 管理队列任务
    ThreadPoolExecutor同意提供一个BlockingQueue来保存等待运行的任务。主要的任务排队方法有3种:无界队列、有界队列、同步移交。

    java.util.concurrent.BlockingQueue 全部已知实现类: 
    ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
     
    3. 饱和策略
    有界队列已经填满或者向关闭的Executor提交任务时须要考虑饱和策略。
    ThreadPoolExecutor.setRejectedExecutionHandler
    public void setRejectedExecutionHandler(RejectedExecutionHandler handler)设置用于未运行任务的新处理程序。

     

    java.util.concurrent.RejectedExecutionHandler 全部已知实现类: 
    ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy 


    AbortPolicy是默认饱和策略
    -- 待填充

    4. 工厂方法

    5. 在调用构造函数后再定制ThreadPoolExecutor
    在创建线程池后。依旧能够通过ThreadPoolExecutor提供的方法改动构造时传入的參数。

    四、扩展ThreadPoolExecutor
    五、递归算法的并行化

    临时用不到





  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6767195.html
Copyright © 2011-2022 走看看