与我之前写过的生产者和消费者不同,这里我们不需要考虑何时去唤醒线程,何时去阻塞线程,可以帮助我们更简洁的实现生产者和消费者问题。http://blog.csdn.net/kai1ge1/article/details/78952825
生产者代码如下:
class Producer implements Runnable {
private BlockingQueue blockingQueue; //java.util.concurrent包下的阻塞队列
public Producer(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
for (int j = 0; j < 20; j++) {
ManTou manTou = new ManTou(j);
try {
blockingQueue.put(manTou); //此处为阻塞式,当队列放不下的时候,线程就会阻塞,知道,队列有空才唤醒
System.out.println("------生产了"+manTou.id);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
消费者代码如下
class Consumer implements Runnable {
private BlockingQueue blockingQueue;
public Consumer(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true) {
try {
ManTou manTou = (ManTou) blockingQueue.take();//take也为阻塞式,当队列为空时阻塞
System.out.println("-------消费了"+manTou.id);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试类
public class ProductAndConsumer {
public static void main(String[] arg0) {
BlockingQueue blockingQueue = new ArrayBlockingQueue(6);
Consumer consumer = new Consumer(blockingQueue);
Producer producer = new Producer(blockingQueue);
new Thread(consumer).start();
new Thread(producer).start();
}
}