生产者与消费者模型的实现
生产者
package apla;
import java.util.Queue;
import java.util.Random;
public class Productor implements Runnable {
// 最大库容
private int maxNum = 10;
// 需要同步的锁
Queue<String> queue;
public Productor(Queue<String> queue ) {
this.queue = queue;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(queue){
while(queue.size()==maxNum){
System.out.println("queue is full, stop product,consume come on");
try {
queue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Random r = new Random();
String c = r.nextInt(100)+"";
System.out.println("Product "+c);
queue.notify();
try {
Thread.sleep(100);//不释放锁,放缓节奏
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
消费者
package apla;
import java.util.Queue;
public class Consumer1 implements Runnable {
// 需要同步的锁
Queue<String> queue;
public Consumer1(Queue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(queue){
while(queue.size()==0){
System.out.println("queue is null, stop consume,product come on");
try {
queue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String p = queue.remove();
System.out.println("Consume "+p);
queue.notify();
try {
Thread.sleep(1000);//不释放锁,放缓节奏
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
测试程序
package apla;
import java.util.LinkedList;
import java.util.Queue;
public class Copy {
public static void main(String[] args) {
// 仓库
Queue<String> queue = new LinkedList<String>();
Thread t1 = new Thread(new Consumer1(queue));
Thread t2 = new Thread(new Productor(queue));
t1.start();
t2.start();
}
}
需要注意的地方
1 wait需要放在一个不断循环的语句中,确保能够被唤醒,执行后边的内容。
2 notify和notifiyall的区别。在两个线程的情况下,二者相同。多个线程的时候,notify不确定唤起那个线程,notifyall唤起所有的线程。
3 wait可以传入时间值,达到自我唤醒的目的。如果设置了时间值,在时间值未达到时被唤醒也会继续执行。
1/18/2016 3:36:08 PM
参考内容