简单生产消费者模型

import java.util.ArrayList;
import java.util.List;

public class ProduceAndConsume {
	public static final Object signal = new Object();
	public static List<String> list = new ArrayList<String>();
	public static void main(String args[]) {
		Thread produce = new Thread(new Produce());
		Thread consume = new Thread(new Consume());
		produce.start();
		consume.start();
	}
}

class Produce implements Runnable{
	@Override
	public void run() {
		int sequence = 0;
		while(true) {
			synchronized(ProduceAndConsume.signal){
				for (int i = 0; i < 3; i++) {
					ProduceAndConsume.list.add(sequence + "commodity");
				}
				sequence++;
				try {
					ProduceAndConsume.signal.notify();
					ProduceAndConsume.signal.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}
class Consume implements Runnable{
	@Override
	public void run() {
		int count = 0;
		while(count < 5) {
			synchronized(ProduceAndConsume.signal) { 
				try {
					ProduceAndConsume.signal.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				if(ProduceAndConsume.list.size() > 0) {
					for (String str : ProduceAndConsume.list) {
						System.out.println(str);
					}
					ProduceAndConsume.list.clear();
					count++;
					ProduceAndConsume.signal.notify();
				}
			}
		}
	}
}

注意 java

1.消费和生产必定要用同一把锁ProduceAndConsume.signal
2.ProduceAndConsume.signal.wait()的做用是当前线程暂停,释放锁signal,转到等待队列中,等待signal这个信号量(signal也是锁)的通知。等到signal的通知以后(而不能是其余信号量的通知),这个线程才有机会转到就绪队列中,去竞争执行的机会。
3.ProduceAndConsume.signal.notify()的做用是通知等待在signal这个信号量的单个线程从等待队列中进入就绪队列,准备竞争执行的机会。但调用ProduceAndConsume.signal.notify()方法的线程并不会立刻释放锁,而是把代码执行完后再释放锁,由于notify只是通知其余等待在这个信号量的线程进入就绪队列,准备竞争锁。 ide