今天向大家介绍一下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工具网。
推荐阅读: