生产消费模型是开发中经常会用到的一个模型,通常我们会使用cocurrent包中的ArrayBlockingQueue配合Executors线程池来实现, 今天我们介绍一种最原生的实现方式 - 基于Object自带的wait、nofity方法来实现, 废话不多说, 直接上代码:
package com;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
/**
* 基于Wait/Notify实现的生产、消费模型
*
* @author John
*
*/
public class WaitNotifyDemo {
public final static int CAPACITY = 10;
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();
Producers thread1 = new Producers("Thread1", queue);
Customers thread2 = new Customers("Thread2", queue);
thread1.start();
thread2.start();
}
}
class Producers extends Thread{
private Queue<Integer> queue;
public Producers(String name, Queue<Integer> queue) {
super(name);
this.queue = queue;
}
@Override
public void run() {
while(true) {
synchronized (queue) {
while(queue.size() == WaitNotifyDemo.CAPACITY) {
System.out .println("Queue is full, " + "Producer thread waiting for " + "consumer to take something from queue");
try {
queue.wait();
} catch (InterruptedException e) {
}
}
Random random = new Random();
int num = random.nextInt(100000);
System.out.println("线程"+Thread.currentThread().getName()+" 生产:"+num);
queue.add(num);
queue.notify();
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Customers extends Thread{
private Queue<Integer> queue;
public Customers(String name, Queue<Integer> queue) {
super(name);
this.queue = queue;
}
@Override
public void run() {
while(true) {
synchronized (queue) {
//当flag不为false时, 等待
while(queue.size() == 0) {
System.out.println("Queue is empty," + "Consumer thread is waiting" + " for producer thread to put something in queue");
try {
queue.wait();
} catch (InterruptedException e) {
}
}
queue.notify();
int num = queue.poll();
System.out.println("线程"+Thread.currentThread().getName()+" 消费:"+num);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}