zoukankan      html  css  js  c++  java
  • 并发编程与高并发学习笔记五

    线程池
    ,new Thread 弊端
    每次new Thread新建对象,性能差
    线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多的系统资源导致死机或OMM
    缺少更多功能,如更多执行,定期执行,线程中断
    ,线程池的好处
    重用存在的线程,减少对象的创建和消亡的开销,新能好
    可以有效的控制最大并发线程数,提高系统资源利用率,同时可以避免过多的资源竞争,避免阻塞
    提供定时执行,定期执行,单线程,并发数控制等功能
    三,相关的类
    1.ThreadPoolExecutor
    参数:
    int corePoolSize:核心线程数量
    int maximumPoolSize:线程最大线程数
    workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池的运行过程产生重大影响
    long keepAliveTime:线程没有执行任务时最多保持多久时间终止
    TimeUnit unit:keepAliveTime的时间单位
    ThreadFactory threadFactory:线程工厂,用来创建线程
    RejectedExecutionHandler handler:当拒绝处理任务时的策略
    2.方法:
    execute():提交任务,交给线程池执行
    submit():提交任务,能够返回执行结果 execute+Future
    shutdown():关闭线程池,等待任务都执行完毕
    shutdownNow():关闭线程池,不等待任务执行完
    线程监控相关的方法:
    getTaskCount():线程池已执行和未执行的任务总数
    getCompletedTaskCount():已完成的任务数量
    getPoolSize():线程池当前线程的数量
    getAliveCount():当前线程池中正在执行任务的线程数量

    ,线程池的状态
    running:可以处理新提交的任务,并且能处理阻塞队列中的任务
    shutdown:关闭状态,不能接受新提交的任务,可以处理阻塞队列中的已经保存的任务。当线程池执行running时调用shutdown()
    方法时,可以进入这个状态
    stop:不接受新的任务,也不能处理阻塞队列中的任务
    tidying:如果所有的人物都已经终止了,工作线程数为0,线程池会进入这个状态
    terminated:tidying状态调用 terminated()方法后,会进入这个状态

    ,Executor框架接口
    Executors.newCachedThreadPool:可缓存的线程池
    Executors.newFixedThreadPool:定长线程池,可以控制线程的最大并发数,超出的线程会在线程池中等待
    Executors.newScheduledThreadPool:定长线程池,支持定时和周期性的任务执行
    Executors.newSingleThreadExecutor:单线程化的线程池,他会用唯一的一个工作线程来执行任务,保证任务按指定顺序执行
    (指定顺序:比如先进先出,优先级等)
    ,使用线程池

    七,线程池-合理配置
    cpu密集型任务,就需要尽量压榨cpu,参考值可以设置为 NCPU+1
    IO密集型任务,参考值可以设置为 2*NCPU

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/inspred/p/9520954.html
Copyright © 2011-2022 走看看