多线程的例子
写出一组模拟生产者/消费者的协作程序
其中包括一个WoTou.java,代表消息
一个MsgQueue.java,为一个队列,提供put(Message msg)方法和get()方法
一个Produer.java,为生产者线程,在其run方法中每隔1秒产生一个Message对像并放入MsgQueue队列
一个Consumer.java为消费者线程,在其run方法中不断从MsgQueue队列中获取Message对像,并显示在屏幕上
一个TestMain.java,在其main方法中,启动2个Produer线程和2个消费者线程.
要求:
对于MsgQueue.java,队列的长度为10,当消息超过10个时,put()方法需要阻塞:当消息队列为空时,
get()方法需要阻塞。
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p1= new Producer(ss,"p1");
Consumer c1= new Consumer(ss,"c1");
Producer p2= new Producer(ss,"p2");
Consumer c2= new Consumer(ss,"c2");
}
}
class WoTou<T> {
int id;
WoTou(int id) {
this.id = id;
}
public String toString() {
return "WoTou : " + id;
}
}
class SyncStack {
int index = 0;
WoTou[] arrWT = new WoTou[6];
public void push(WoTou wt) {
while(index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index] = wt;
index ++;
}
public WoTou pop() {
while(index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
index--;
return arrWT[index];
}
}
class Producer implements Runnable {
SyncStack ss = null;
String a;
Producer(SyncStack ss,String a) {
this.ss = ss;
this.a= a;
Thread t=new Thread(this,a);
t.start();
}
public void run() {
for(int i=0; i<10; i++) {
synchronized(ss){
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println(a+" 生产了:" + wt);}
try {
Thread.sleep((int)(Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
SyncStack ss = null;
String a;
Thread t;
Consumer(SyncStack ss,String a) {
this.ss = ss;
this.a= a;
t=new Thread(this,a);
t.start();
}
public void run() {
for(int i=0; i<10; i++) {
synchronized(ss){
WoTou wt = ss.pop();
System.out.println(a+" 消费了: " + wt);}
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
p1 生产了:WoTou : 0
p2 生产了:WoTou : 0
p3 生产了:WoTou : 0
c1 消费了: WoTou : 0
c1 消费了: WoTou : 0
p3 生产了:WoTou : 1
c1 消费了: WoTou : 1
c1 消费了: WoTou : 0
p3 生产了:WoTou : 2
p1 生产了:WoTou : 1
c1 消费了: WoTou : 1
p2 生产了:WoTou : 1
p2 生产了:WoTou : 2
c1 消费了: WoTou : 2
p2 生产了:WoTou : 3
p3 生产了:WoTou : 3
c1 消费了: WoTou : 3
p3 生产了:WoTou : 4
p2 生产了:WoTou : 4
c1 消费了: WoTou : 4
c1 消费了: WoTou : 4
p1 生产了:WoTou : 2
c1 消费了: WoTou : 2
p2 生产了:WoTou : 5
p3 生产了:WoTou : 5
p2 生产了:WoTou : 6
栈里有6个