BlockingQueue是队列的基础上加上阻塞操作。队列中没有数据时从队头取数据会被阻塞,队列中有数据了就会被被阻塞的线程取出数据,数据会被释放。若队列有容量限制,容量满的话插入数据会被阻塞,有空闲位置才能插入数据。
示例代码如下:
public class BlockingQueueTest {
public static void main(String[] args) {
final BlockingQueue queue = new ArrayBlockingQueue(3);
for(int i = 0; i < 2; i++) {
new Thread() {
public void run() {
while(true) {
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println(Thread.currentThread().getName() + "准备放数据!");
queue.put(1);
System.out.println(Thread.currentThread().getName() + "已经放了数据," +
"队列目前有" + queue.size() + "个数据");
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
new Thread() {
public void run() {
while(true) {
try{
//此处100改为1000,观察情况
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "准备取数据!");
queue.take();
System.out.println(Thread.currentThread().getName() + "已经取了数据," +
"队列目前有" + queue.size() + "个数据");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
执行结果如下:
Thread-2准备取数据!
Thread-1准备放数据!
Thread-1已经放了数据,队列目前有1个数据
Thread-2已经取了数据,队列目前有0个数据
Thread-2准备取数据!
Thread-0准备放数据!
Thread-0已经放了数据,队列目前有1个数据
Thread-2已经取了数据,队列目前有0个数据