Java队列,包括,阻塞队列和非阻塞队列, 数据都是先进先出。阻塞队列,在添加的时候,如果队列已满,则保持阻塞,相反在从队列中取元素的时候,如果队列元素是空的,保持阻塞。
阻塞队列,BlockingQueue, 其实现包括,LinkedBlockingQueue(基于链表FIFO), ArrayBlockingQueue(基于数组的FIFO队列), SynchronousQueue(并发同步阻塞队列)
package blockque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new LinkedBlockingQueue();
Producer producer = new Producer(blockingQueue);
Consumer Consumer = new Consumer(blockingQueue);
producer.start();
Consumer.start();
try {
Thread.sleep(1000 * 2);
}catch (Exception e) {
}
producer.FALG = false;
}
}
class Producer extends Thread {
private BlockingQueue blockingQueue;
/**volatile 保证线程间的可见性, 当共享变量被修改hi后,其他线程对该变量立马可见**/
public volatile boolean FALG = true;
public Producer (BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true) {
System.out.println("正在生产:面包");
try {
boolean res = blockingQueue.offer("面包" , 2, TimeUnit.SECONDS);
if (!FALG) {
if (res) {
System.out.println("已经不需要再生产面包了");
return;
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread {
private BlockingQueue<String> blockingQueue;
public Consumer (BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
try {
while (true) {
String data = blockingQueue.poll(2, TimeUnit.SECONDS);
System.out.println("正在消费:" + data);
if (data == null) {
System.out.println("没有面包了,退出吧");
return;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}