今天向大家介绍一下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队列种类繁多内容丰富,因此想要熟练地应用它就需要花费更多的心思了。