并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列尾部,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。
package cn.com.classTest;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
public class BlockingQueueTest extends Thread {
public static BlockingQueue<String> queue = new LinkedBlockingQueue<String>(4);
private int index;
public BlockingQueueTest(int i) {
this.index = i;
}
public void run() {
try {
queue.put(String.valueOf(this.index));
System.out.println(this.index + ":" + Thread.currentThread().getName());
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
ExecutorService service = Executors.newCachedThreadPool();
for(int i = 0; i < 10; i++) {
service.submit(new BlockingQueueTest(i));
}
Thread thread = new Thread() {
public void run() {
try {
while(true) {
Thread.sleep((int)(Math.random() * 1000));
if(BlockingQueueTest.queue.isEmpty())
break;
String str = BlockingQueueTest.queue.take();
System.out.println("take {" + str + "} out of queue!");
}
} catch(Exception e) {
e.printStackTrace();
}
}
};
service.submit(thread);
service.shutdown();
}
}