我在此篇文章( http://blog.youkuaiyun.com/fengzhe0411/article/details/6949622 )中详细介绍了生产者-消费者模型的实现和操作系统的一些原理
但是,对操作系统原理不是太了解的人可能写起wait(),notify(),notifyAll()之类的方法会很吃力
好在java1.5以后提供了concurrent包 里面包含了大量线程同步所需要的工具
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class NewProducerConsumer {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
ProducerThread pt1 = new ProducerThread(queue);
ProducerThread pt2 = new ProducerThread(queue);
ProducerThread pt3 = new ProducerThread(queue);
ConsumerThread ct1 = new ConsumerThread(queue);
ConsumerThread ct2 = new ConsumerThread(queue);
ConsumerThread ct3 = new ConsumerThread(queue);
pt1.setName("生产者1号");
pt2.setName("生产者2号");
pt3.setName("生产者3号");
ct1.setName("消费者1号");
ct2.setName("消费者1号");
ct3.setName("消费者1号");
pool.submit(pt1);
pool.submit(pt2);
pool.submit(pt3);
pool.submit(ct1);
pool.submit(ct2);
pool.submit(ct3);
pool.shutdown();
}
}
/* 生产者线程 */
class ProducerThread extends Thread {
private BlockingQueue<Integer> queue;
public ProducerThread(BlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run() {
while (true)
try {
queue.put(1);
System.out.println(Thread.currentThread().getName() + "生产了1个");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/* 消费者线程 */
class ConsumerThread extends Thread {
private BlockingQueue<Integer> queue;
public ConsumerThread(BlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run() {
while (true) {
try {
queue.take();
System.out.println(Thread.currentThread().getName() + "消费了1个");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这里BlockingQueue就当相当于我以前实现的Factory 我以前只是在Factory中以数字的增减来表明货物的多少
而大家都知道队列遵循“先进先出”原则 并且这里的BlockingQueue已经在内部实现了等待-唤醒的操作
我们只用调用API就好了