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

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
    单线程化线程池,用唯一的线程执行任务,保证所有任务按照指定顺序执行若有多余的任务提交到线程池中,则会被暂存到阻塞队列.待空闲时再去执行。按照先入先出的顺序执行任务。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,805评论 0 12
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,913评论 1 17
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 2,893评论 2 20
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,773评论 2 17
  • 第一部分 来看一下线程池的框架图,如下: 1、Executor任务提交接口与Executors工具类 Execut...
    压抑的内心阅读 4,401评论 1 24

友情链接更多精彩内容