java队列有哪些?队列如何实现执行任务?

BSO 2020-08-27 12:24:51 java常见问答 8608

今天向大家介绍一下java队列有哪几种,分别适用于哪种情况,并且用实例为大家展示队列是如何执行任务的。

第一种:BlockingQueue

它有四个具体的实现类,根据不同需求,选择不同的实现类;

第二种:ArrayBlockingQueue

它是基于数组结构的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。它所包含的对象是以FIFO(先入先出)顺序排序的;

第三种:LinkedBlockingQueue

它是基于链表结构的阻塞队列,大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由IntegerMAX_VALUE来决定。其所含的对象是以FIFO顺序排序的,吞吐量通常要高于ArrayBlockingQueue;

第四种:PriorityBlockingQueue

它是具有优先级的无限阻塞队列,类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序;

第五种:SynchronousQueue

它不存储元素的阻塞队列,对它的操作必须是放和取交替完成的,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue;

第六种:LinkedBlockingQueue

它和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。

下面通过一个实例来展示队列如何实现执行任务。

package com.tone.example;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.tone.task.TaskProperty;
import com.tone.task.TaskSignature;
import com.tone.task.impl.BasicTask;
import com.tone.task.runner.TaskRunner;
/** 
 * 任务队列示例程序 
 * @author zlf 
 */
public class TaskExample
{
    private TaskRunner taskRunner;
    /** 
     * 做任2113务队列的初始化5261工作 
     */
    @Before
    public void init()
    {
        // 获取4102任务运行器 
        taskRunner = TaskRunner.getInstance();
        // 将任务运行器放入线程进行调度1653 
        Thread thread = new Thread(taskRunner);
        thread.start();
    }
    /** 
     * 等待任务执行完成,并做最后的退出工作 
     */
    @After
    public void exit() throws InterruptedException
    {
        Thread.sleep(600);
        System.exit(0);
    }
    /** 
     * 最简单的任务运行示例 
     */
    @Test
    public void example1()
    {
        // 添加任务到任务运行器 
        taskRunner.addTask(new BasicTask()
        {
            @Override
            public void run()
            {
                System.out.println("This is running in task runner thread, and thread is " + Thread.currentThread());
            }
        });
    }
    /** 
     * 加入优先执行顺序的任务运行器 
     */
    @Test
    public void example2()
    {
        // 添加任务到任务运行器 
        taskRunner.addTask(new BasicTask(0)
        {
            @Override
            public void run()
            {
                System.out.println("This is a normal task");
            }
        });
        taskRunner.addTask(new BasicTask(-1)
        {
            @Override
            public void run()
            {
                System.out.println("This is a task a bit high than normal");
            }
        });
    }
    /** 
     * 重复添加的任务只会运行第一个 
     */
    @Test
    public void example3()
    {
        // 添加任务到任务运行器 
        taskRunner.addTask(new BasicTask(TaskSignature.ONE)
        {
            @Override
            public void run()
            {
                System.out.println("This is task one");
            }
        }, TaskProperty.NOT_REPEAT);
        taskRunner.addTask(new BasicTask(TaskSignature.ONE)
        {
            @Override
            public void run()
            {
                System.out.println("This is also task one");
            }
        }, TaskProperty.NOT_REPEAT);
    }
    /** 
     * 重复添加的任务只会运行最后一个 
     */
    @Test
    public void example4()
    {
        // 添加任务到任务运行器 
        taskRunner.addTask(new BasicTask(TaskSignature.ONE)
        {
            @Override
            public void run()
            {
                System.out.println("This is task one");
            }
        }, TaskProperty.NOT_REPEAT_OVERRIDE);
        taskRunner.addTask(new BasicTask(TaskSignature.ONE)
        {
            @Override
            public void run()
            {
                System.out.println("This is also task one");
            }
        }, TaskProperty.NOT_REPEAT_OVERRIDE);
    }
}

综上所述,java队列种类繁多内容丰富,因此想要熟练地应用它就需要花费更多的心思了。想要了解更多对于队列的java经典例子,敬请关注奇Q工具网。

推荐阅读:

java队列方法有哪些?什么是循环队列?

java队列实现方式实例展示,什么是阻塞队列?

java队列使用的方法是什么?它应该在什么情况下使用?