最近复习Java,重写了生产者消费者问题。
采用synchronized锁以及wait notify方法实现。
package Thread;
import java.util.LinkedList;
class Producer implements Runnable{
ProducerConsumer p;
String name;
Producer(ProducerConsumer p, String name){
this.p = p;
this.name = name;
}
@Override
public void run(){
// TODO Auto-generated method stub
while(true){
try{
Thread.sleep(1000);
p.putOne();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
ProducerConsumer p;
String name;
Consumer(ProducerConsumer p, String name){
this.p = p;
this.name = name;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try{
Thread.sleep(1000);
p.getOne();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
public class ProducerConsumer {
private byte[] b = new byte[0];
private static LinkedList<Object> store = new LinkedList<Object>();
public int putOne() throws InterruptedException{
synchronized(b){
if(store.size() >= 10){
b.wait();
return 1;
}
else{
Object e = new Object();
store.add(e);
System.out.println("Add one to " + store.size() + " by " + Thread.currentThread());
b.notifyAll();
return 0;
}
}
}
public int getOne() throws InterruptedException{
synchronized(b){
if(store.size() == 0){
System.out.println("before wait");
b.wait();
System.out.println("after wait");
return 1; //这里不return,直接removeFirst也可以。
}
else{
store.removeFirst();
System.out.println("remove one to " + store.size() + " by " + Thread.currentThread());
b.notifyAll();
return 0;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ProducerConsumer P = new ProducerConsumer();
Runnable[] thread = new Runnable[6];
for(int i = 0; i < 3; ++i){
thread[i] = new Consumer(P, "Consumer" + i);
}
for(int i = 3; i < 6; ++i){
thread[i] = new Producer(P, "Producer" + i);
}
for(int i=0; i < 6; ++i){
new Thread(thread[i]).start();
}
/*
new Thread(thread[1]).start();
new Thread(thread[4]).start();
上面两句输出的前三句一定为
before wait
Add one to 1 by Thread[Thread-1,5,main]
after wait
*/
}
}