您的位置:首页 > 产品设计 > UI/UE

阻塞队列之LinkedBlockingQueue

2019-02-21 22:37 141 查看

LinkedBlockingQueue特点:

1、数据结构:单向链表;

2、有界队列,默认长度为:Integer.MAX_VALUE;

3、和ArrayBlockingQueue一样,不允许放入空值;

4、元素按FIFO排序;

对比ArrayBlockingQueue:

1、存储结构不同,ArrayBlockingQueue 采用对象数组存储数据;LinkedBlockingQueue采用单向链表存储数据;

2、构造不同,ArrayBlockingQueue必须指定长度,且可以指定是否使用公平锁定及初始集合;而LinkedBlockingQueue可以不指定长度,默认值是Integer.MAX_VALUE,另外LinkedBlockingQueue不支持参数化设置公平锁或非公平锁,默认是非公平锁:NonfairSync;

3、操作方法相同,ArrayBlockingQueue放入元素:add(抛异常)、offer(返回true、false)、put(阻塞等待),取出元素:poll、take;而LinkedBlockingQueue也都一样;

生产者消费者模式中都可以使用阻塞队列,关键是要用put阻塞方法和take阻塞方法;

[code]import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
* 基本和ArrayBlockingQueue一样 区别有:
* ArrayBlockingQueue--数组结构、必须指定长度、可以定制使用工作锁或非公平锁;
* LinkedBlockingQueue--单向链表结构、可以不指定长度,默认是Integer.MAX_VALUE,不能指定使用何种锁;
*/
public class LinkedBlockingQueueTest {

private ExecutorService threadPool = Executors.newFixedThreadPool(2);

private LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<String>();

public LinkedBlockingQueueTest() {
}

private void test() {
// put
threadPool.submit(new Runnable() {
public void run() {
System.out.println("Please input:");
Scanner sc = new Scanner(System.in);
String readLine = null;
while (true) {
readLine = sc.nextLine();
try {
if ("quit".equalsIgnoreCase(readLine)) {
linkedBlockingQueue.put("quit");
break;
} else {
linkedBlockingQueue.put(readLine);
}
} catch (Exception e) {
e.printStackTrace();
}
}
sc.close();
}
});

// take
threadPool.submit(new Runnable() {
public void run() {
try {
String takeLine = null;
while (true) {
takeLine = linkedBlockingQueue.take();
if ("quit".equalsIgnoreCase(takeLine)) {
break;
} else {
System.out.println("take:" + takeLine);
}
TimeUnit.MILLISECONDS.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}

public static void main(String[] args) {
LinkedBlockingQueueTest linkedBlockingQueueTest = new LinkedBlockingQueueTest();
linkedBloc
4000
kingQueueTest.test();
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: