zoukankan      html  css  js  c++  java
  • Java 多线程

    一、线程池对应的阻塞队列

    LinkedBlockingQueue

    第一种阻塞队列是 LinkedBlockingQueue,它的容量是 Integer.MAX_VALUE,为 231 -1 ,是一个非常大的值,可以认为是无界队列。

    FixedThreadPool 和 SingleThreadExecutor 线程池的线程数是固定的,所以没有办法增加特别多的线程来处理任务,这时就需要 LinkedBlockingQueue 这样一个没有容量限制的阻塞队列来存放任务。

    SynchronousQueue

    如果不希望任务在队列中等待而是希望将任务直接移交给工作线程,可使用SynchronousQueue作为等待队列。SynchronousQueue不是一个真正的队列,而是一种线程之间移交的机制。要将一个元素放入SynchronousQueue中,必须有另一个线程正在等待接收这个元素。只有在使用无界线程池或者有饱和策略时才建议使用该队列。

    DelayedWorkQueue

    第三种阻塞队列是DelayedWorkQueue,它对应的线程池分别是 ScheduledThreadPool 和 SingleThreadScheduledExecutor,这两种线程池的最大特点就是可以延迟执行任务,比如说一定时间后执行任务或是每隔一定的时间执行一次任务。

    DelayedWorkQueue 的特点是内部元素并不是按照放入的时间排序,而是会按照延迟的时间长短对任务进行排序,内部采用的是“堆”的数据结构(堆的应用之一就是 优先级队列)。之所以线程池 ScheduledThreadPool 和 SingleThreadScheduledExecutor 选择 DelayedWorkQueue,是因为它们本身正是基于时间执行任务的,而延迟队列正好可以把任务按时间进行排序,方便任务的执行。

    参考文献

    ————————————————
    版权声明:本文为CSDN博主「不懂的浪漫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xiewenfeng520/article/details/106954169

  • 相关阅读:
    beginAppearanceTransition
    runtime基础
    UIStoryboard跳转界面
    xcode所有版本下载地址
    UIImage添加滤镜
    苹果copy等其他的英文改成中文
    UITextField输入中文
    keyboard添加down按钮
    2020-07-08:mysql只有一个表a,什么情况下会造成死锁,解决办法是什么?
    2020-07-05:tcp和udp的区别和应用场景。如何实现断点续传?
  • 原文地址:https://www.cnblogs.com/frankcui/p/15262412.html
Copyright © 2011-2022 走看看