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

  • 相关阅读:
    docker入门
    初级排序算法1-定义排序规则
    Lambda入门
    mac编辑器vim美化
    SSM搭建
    Memcached安装教程及使用
    lombok
    立个Flag-第一天
    等高线自适应分割
    wpf软件模拟鼠标键盘操作
  • 原文地址:https://www.cnblogs.com/inspred/p/9520954.html
Copyright © 2011-2022 走看看