• 技术文章 >java >java基础

    java线程池的工作队列有哪几个

    小妮浅浅小妮浅浅2021-01-11 13:46:22原创5424

    1

    <br>

    在线程池中的某一任务完成后,我们不知道新的任务已经到达等待处理,这时候就要加入工作队列的原理了。就线程池里面而言,分为许多工作队列等待我们去处理任务,这里需要我们对这些队列有一个初步的掌握。下面我们就线程池工作队列概念进行讲解,然后带来几种常见的队伍进行分享。

    1.工作队列概念

    通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和 notify() 来通知等待线程新的工作已经到达了。该工作队列通常被实现成具有相关监视器对象的某种链表。尽管 Thread API 没有对使用Runnable 接口强加特殊要求,但使用 Runnable 对象队列的这种模式是调度程序和工作队列的公共约定。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    public class WorkQueue

    {

        private final int nThreads;

        private final PoolWorker[] threads;

        private final LinkedList queue;

        public WorkQueue(int nThreads)

        {

            this.nThreads = nThreads;

            queue = new LinkedList();

            threads = new PoolWorker[nThreads];

            for (int i=0; i<nThreads; i++) {

                threads[i] = new PoolWorker();

                threads[i].start();

            }

        }

        public void execute(Runnable r) {

            synchronized(queue) {

                queue.addLast(r);

                queue.notify();

            }

        }

        private class PoolWorker extends Thread {

            public void run() {

                Runnable r;

                while (true) {

                    synchronized(queue) {

                        while (queue.isEmpty()) {

                            try

                            {

                                queue.wait();

                            }

                            catch (InterruptedException ignored)

                            {

                            }

                        }

                        r = (Runnable) queue.removeFirst();

                    }

                    // If we don't catch RuntimeException,

                    // the pool could leak threads

                    try {

                        r.run();

                    }

                    catch (RuntimeException e) {

                        // You might want to log something here

                    }

                }

            }

        }

    2.工作队列种类

    1ArrayBlockingQueue

    ArrayBlockingQueue(有界队列)是一个用数组实现的有界阻塞队列,按FIFO排序量。

    2LinkedBlockingQueue

    LinkedBlockingQueue(可设置容量队列)基于链表结构的阻塞队列,按FIFO排序任务,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,长度为Integer.MAX_VALUE,吞吐量通常要高于ArrayBlockingQuene;newFixedThreadPool线程池使用了这个队列

    3DelayQueue

    DelayQueue(延迟队列)是一个任务定时周期的延迟执行的队列。根据指定的执行时间从小到大排序,否则根据插入到队列的先后排序。newScheduledThreadPool线程池使用了这个队列。

    以上就是java线程池的工作队列介绍,相信大家已经对这么工作队列有了初步的认知,并能明确它们分别的使用场景。其他的一些工作队列,大家也可以课后查询资料。

    专题推荐:java线程池的工作队列
    上一篇:java线程池异常的处理方法 下一篇:BlockingQueue在java中的使用

    相关文章推荐

    • ThreadPoolExecutor在java中创建线程池• java线程池的运行流程• java线程池创建方式• java线程池异常的处理方法

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网