美文网首页
code搬运工_深入多线程(v1)

code搬运工_深入多线程(v1)

作者: 自由的灯塔 | 来源:发表于2019-04-08 20:51 被阅读0次

    Runnable与Callable接口的方式创建多线程的特点 :

    • 线程类只是实现了Runnable接口或Callable接口,还可以继承其它类
    • 在这种方式下 , 多个线程可以共享一个target对象 , 所以非常适合多个线程来处理同一份资源情况
    • 如果需要访问当前线程,需要使用Thread.currentThread方法
    • Callable接口与Runnable接口相比,只是Callable接口可以返回值而已(future)

    Thread类的方式创建多线程的特点 :

    • 因为线程已经继承Thread类,所以不可以再继承其它类
    • 如果需要访问当前线程,直接使用this即可
      线程池

    Thread 弊端 :

    • 性能差,缺乏统一管理,相互竞争,占用过多系统资源,导致死机或OOM

    线程池ThreadPoolExecutor 优势 :

    • 重用线程,减少创建和销毁,性能好
    • 有效控制最大并发,提高系统资源利用率,避免过多资源竞争,避免阻塞
    • 提供定时定期执行、单线程、并发数控制的功能

    相关参数 :

    • corePoolSize:核心线程数
    • maximumPoolSize:线程最大线程数
    • workQueue:阻塞队列,存储等待执行任务
    • KeepAliveTime:线程没有任务执行时最久保持多久时间终止
    • unit:KeepAliveTime的时间单位
    • threadFactory:线程工厂,用来创建线程
    • rejectHandler:当拒绝处理任务时策略

    线程池状态 :

    • runing:接收新提交的任务和阻塞队列中任务
    • shutdown:关闭,不能接收新提交任务,可以处理阻塞队列中缓存任务
    • stop:关闭,不接收新提交任务和阻塞状态中的任务
    • tidying:任务结束,有效线程数数为0
    • terminated:线程池内部处理

    相关方法 :

    • execute():提交任务,交给线程池执行
    • submit():提交任务,能够返回执行结果 execute+future
    • shutdown():关闭线程池,等待任务处理完
    • shutdownNow():关闭线程池,不等待任务处理完
    • getTaskCount():线程池已执行和未执行的任务总数
    • getCompletedTaskCount():已完成任务数量
    • getPoolSize():线程池当前线程数量
    • getActiveCount():当前线程中正在执行任务的线程数量

    相关类库 :

    • Executors
    • ThreadPoolExecutor ScheduledThreadPoolExecutor

    什么是线程池 :

    • 根据一组执行策略的调用、调度、执行和控制的异步任务框架
    • 提供一种任务提交和运行分离机制
    • 接口: Executor、ExcutorService、ScheduledExecutorService

    四种线程池 :

    • newCachedThreadPool
      可缓存线程池,线程池长度超出需要,可以灵活处理空闲线程,没有可回收的则新建线程
      在线程池空闲时,即线程池中没有可运行任务时,它会释放工作线程,从而释放工作线程所占用的资源
      当出现新任务时,又要创建新的工作线程,这会带来一定的系统开销。
      并且在使用CachedThreadPool时,一定要注意控制任务的数量,否则大量线程同时运行,可能会造成系统瘫痪
    • newFixedThreadPool
      定长线程池,控制最大并发数,超出线程在队列等待
      具有线程池的高效率和节省创建线程时所耗的开销的优点。
      在线程池空闲时,即线程池中没有可运行任务时,
      它不会释放工作线程,还会占用一定的系统资源。
    • newScheduledThreadPool
      定长线程池,定时、周期性任务执行
    • newSingleThreadExecutor
      单线程化线程池,用唯一的线程执行任务,保证所有任务按照指定顺序执行若有多余的任务提交到线程池中,则会被暂存到阻塞队列.待空闲时再去执行。按照先入先出的顺序执行任务。

    相关文章

      网友评论

          本文标题:code搬运工_深入多线程(v1)

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