美文网首页
java多线程(六)线程池

java多线程(六)线程池

作者: 7ColorLotus | 来源:发表于2020-05-25 10:02 被阅读0次
  • 什么是线程池,为什么要线程池

    1. 降低资源消耗,降低创建和销毁的资源消耗
    2. 提高响应速度:线程的创建时间为T1,执行时间为T2,销毁时间T3,免去T1和T3的时间
    3. 提高线程的可管理性
  • 实现一个自己的线程池

    1. 线程在池子已经创建好了,并且可以保持住,要有容器保存多个线程
    2. 线程还要能接受外部的任务,并运行这个任务
  • 线程池的创建

    1. ThreadPoolExecutor,jdk所有线程池实现的父类
    2. 各个参数含义
      1> int corePoolSize:线程池中核心线程数,<corePoolSize,就会创建线程,=corePoolSize这个任务就会保存到BlockingQueue。
      PrepareAllCoreThreads()方法就会一次性创建corePoolSize个线程
      2> int maximumPoolSize:允许的最大线程数,BlockingQueue也满了,<maximumPoolSize时候就会再次创建新的线程
      3> long keepAliveTime:线程空闲下来存活的时间,这个参数只在线程数>corePoolSize才有用
      4> TimeUnit unit:存活时间单位
      5> BlockingQueue<Runnable> workQueue,保存任务的阻塞队列
      6> ThreadFactory threadFactory:创建线程的工厂,给新建的线程赋予名字
      7> RejectExcutionHandler handler:饱和策略
      AbortPolicy:直接抛出异常,默认的
      CallerRunsPolicy:用调用者所在的线程来执行任务
      DiscardOldestPolicy:丢弃阻塞队列里最老的任务,队列里最靠前的任务
      DiscardPolicy:当前任务直接抛弃
      实现自己的饱和策略:实现RejectExcutionHandler接口即可
  • 提交任务

    1. execute(Runnable command) 不需要返回
    2. submit(Callable callable) 需要返回
  • 关闭线程池

    1. shutdown():设置线程池的状态,只会中断所有没有执行任务的线程
    2. shutdownNow():设置线程池的状态,还会尝试停止正在运行或者暂停任务的线程
  • 合理配置线程池

    1. 根据任务的性质来:计算密集型(cpu),IO密集型,混合型
    2. 计算密集型:加密,大数分解,正则。。。。Cpu数适当小一点,最大推荐:机器的Cpu核心数+1,+1为了防止页缺失。Runtime.getRuntime().availableProcessors()获取CPU核心数
    3. IO密集型:读取文件,数据库连接,网络通讯。线程数适当大一点。机器的cpu核心数*2
    4. 混合型:尽量拆分。当IO密集型远大于计算密集型,拆分意义不大;当IO密集型远约等于计算密集型,非常有必要
    5. 队列的选择应该使用有界;无界队列可能会导致内存溢出OOM
  • 预定义的线程池(最好不要用,它们的阻塞队列都使用了无界队列,饱和策略不适合生产任务,尽量使用ThreadPoolExecutor)

    1. FixedThreadPool:创建固定数量,适用于负载较重的服务器,使用了无界队列
    2. SingleThreadExecutor:创建单个线程,需要顺序保证执行任务,不会有多个线程活动,使用了无界队列
    3. CachedThreadPool:会根据需要来创建新线程,适用于很多短期异步任务的程序
    4. WorkStealingPool(jdk7以后):基于ForkJoin
    5. ScheduledThreadPool:适用于定期执行任务的连接池,Timer不建议使用,异常处理的不好。
      1> newSingleThreadScheduledExecutor:只包含一个线程,只需要单个线程执行周期任务,保证顺序的执行各个任务
      2> newScheduledThreadPool:可以包含多个线程,线程执行周期任务,适度控制后台线程数量的时候
      3> 方法说明
      a,schedule:只执行一次,任务还可以延迟执行
      b,scheduleAtFixedRate:提交固定时间间隔的任务,两个任务头之间的间隔是固定的
      c,scheduleWithFixedDelay:提交固定延时间隔的任务,前一个任务的结尾和后一个任务的头之间的时间间隔是固定的
      4> 建议在提交给ScheduledThreadPoolExcutor的任务要catch异常
    6. Executor类图


      Executor类图.png
    7. Executor的基本使用图


      Executor的基本使用.png
  • CompletionService:线程池中的线程合理管理

相关文章

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • 线程

    Java 并发编程:线程池的使用 Java 并发编程:线程池的使用java 多线程核心技术梳理 (附源码) 本文对...

  • Java源码-线程池

    一、线程池实现原理 Java支持多线程,多线程可以提高任务的执行效率。但是Java里面的线程跟操作系统的线程是一一...

  • Java面试题——多线程

    Java面试题——多线程 1,什么是线程池? 线程池是多线程的一种处理方式,处理过程中将任务提交给线程池,任务执行...

  • java多线程(六)线程池

    什么是线程池,为什么要线程池降低资源消耗,降低创建和销毁的资源消耗提高响应速度:线程的创建时间为T1,执行时间为T...

  • Java多线程(六)线程池

    一、类继承图 & 状态转化   线程池类继承图如下所示:   线程池状态转化图如下所示: 二、ThreadPool...

  • 阿里巴巴Java高级岗必问面试题总结:JVM+多线程+网络+Re

    阿里巴巴Java高级岗必问面试题总结 一、Java多线程相关 线程池的原理,为什么要创建线程池?创建线程池的方式;...

  • 线程的并发工具类

    Java 下多线程的开发我们可以自己启用多线程,线程池,除此之外,Java还为我们提供了Fork-Join、Cou...

  • [第三期:JAVA并发:线程池管理 ThreadPoolExec

    源码不会骗你的!!! 一、背景 JAVA通过多线程的方式实现并发,为了方便线程池的管理,JAVA采用线程池的方式对...

网友评论

      本文标题:java多线程(六)线程池

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