【java】Queue

来源:互联网 发布:linux激活虚拟网卡 编辑:程序博客网 时间:2024/06/05 20:15

在java多线程应用中,队列的使用频率是非常高的。队列是一种先进先出的数据结构,它有两个基本的操作,在队列尾部添加一个元素以及从队列头部移除一个元素。如果向一个已经满了的阻塞队列中添加一个元素或者从一个空的阻塞队列中移除一个元素,都将会导致线程阻塞。

阻塞与非阻塞关注的是程序在等待调用结果(消息、返回值)的状态。阻塞调用指的是在调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回,而非阻塞调用指的是在不能立刻得到结果之前,该调用不会阻塞当前线程。

java语言中提供的线程安全队列可以分为阻塞队列和非阻塞队列,其中,阻塞队列的典型例子是LinkedBlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在应用中要根据实际需要选用阻塞队列和非阻塞队列。

LinkedBlockingQueue是一个线程安全的阻塞队列,实现了先进先出等特性,一般用在生产者和消费者模型的开发中。它的地层采用链表的方式来实现的,采用锁机制来实现多线程同步,提供了一个构造方法来指定队列的大小,如果不指定大小,队列默认大小为int类型能够表示的最大值

ConcurrentLinkedQueue是一个基于链表实现的、无界的、线程安全的队列。无界表示它没有提供一个构造方法来指定队列的大小,为了能够提高并发量,它是通过更加细粒度锁的机制使得在多线程环境下需要对所有的数据进行锁定从而提高运行效率


package study;import java.util.LinkedList;import java.util.Queue;public class TestQueue {    public static void main(String[] args) {        Queue<String> queue = new LinkedList<String>();        queue.offer("Hello");        queue.offer("World!");        queue.offer("你好!");        System.out.println(queue.size());        String str;        while((str=queue.poll())!=null){            System.out.print(str);        }        System.out.println();        System.out.println(queue.size());    }}



0 0
原创粉丝点击