线程之 生产者消费者例证
线程之 生产者消费者例子
package hpu.acm.lzl.demos;
/**
* 生产者和消费者问题
* 问题描述:一个篮子容器放馒头,生产者负责生产馒头,往篮子里面放,消费者负责从篮子里面拿馒头吃。
* @author lzl
*问题分析:
*里面有 篮子容器类 SyncStack 提供push方法用于生产者的生产,pop类用于消费者消费
* 馒头类 StreamedBun
* 生产这类 Producer
* 消费者类 Consumer
*/
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(c).start(); //消费者
}
}
//定义馒头类,提供其ID号
class StreamedBun{
int id ;
public StreamedBun(int id) {
this.id = id;
}
public String toString(){
return "馒头:"+id;
}
}
//定义一个容器盛放馒头
class SyncStack{
StreamedBun []mt = new StreamedBun[10]; //定义容器中只能装入10个馒头
int index=0; //添加一个索引,用于查找
//将生产的馒头进行累加,synchronized关键字用于锁定当前方法,防止其他线程打断
public synchronized void push(StreamedBun sb) {
while(index == mt.length){
try {
this.wait(); //这里如果篮子中的馒头装满了,就要等待消费者消费一些,才能再生产。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify(); //将唤醒生产者,进行生产馒头。
mt[index] = sb; //将馒头加到容器当中
index++;
}
//从篮子中取出馒头的方法。
public synchronized StreamedBun pop(){
while(index == 0){
try {
this.wait(); //消费者要考虑,篮子中如果馒头空了,那么就要等待生产者,生产馒头。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify(); //将唤醒消费者,吃馒头。
index -- ;
return mt[index];
}
}
//生产者,只需要调用 篮子容器的push方法,便能进行生产了。
class Producer implements Runnable{
public SyncStack ss;
public Producer(SyncStack ss) {
this.ss = ss;
}
@Override
public void run() {
for(int i=0;i<30;i++){ //假设循环生产30个 馒头
StreamedBun sb = new StreamedBun(i);
ss.push(sb);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("生产者:生产了"+sb);
}
}
}
//消费者,只需要调用 篮子容器的pop方法,便能进行消费。
class Consumer implements Runnable{
public SyncStack ss;
public Consumer(SyncStack ss) {
this.ss = ss;
}
@Override
public void run() {
for(int i =0;i<30;i++){
StreamedBun sb = ss.pop();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("消费者:消费了"+sb);
}
}
}
package hpu.acm.lzl.demos;
/**
* 生产者和消费者问题
* 问题描述:一个篮子容器放馒头,生产者负责生产馒头,往篮子里面放,消费者负责从篮子里面拿馒头吃。
* @author lzl
*问题分析:
*里面有 篮子容器类 SyncStack 提供push方法用于生产者的生产,pop类用于消费者消费
* 馒头类 StreamedBun
* 生产这类 Producer
* 消费者类 Consumer
*/
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p = new Producer(ss);
Consumer c = new Consumer(ss);
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(p).start(); //生产者
new Thread(c).start(); //消费者
}
}
//定义馒头类,提供其ID号
class StreamedBun{
int id ;
public StreamedBun(int id) {
this.id = id;
}
public String toString(){
return "馒头:"+id;
}
}
//定义一个容器盛放馒头
class SyncStack{
StreamedBun []mt = new StreamedBun[10]; //定义容器中只能装入10个馒头
int index=0; //添加一个索引,用于查找
//将生产的馒头进行累加,synchronized关键字用于锁定当前方法,防止其他线程打断
public synchronized void push(StreamedBun sb) {
while(index == mt.length){
try {
this.wait(); //这里如果篮子中的馒头装满了,就要等待消费者消费一些,才能再生产。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify(); //将唤醒生产者,进行生产馒头。
mt[index] = sb; //将馒头加到容器当中
index++;
}
//从篮子中取出馒头的方法。
public synchronized StreamedBun pop(){
while(index == 0){
try {
this.wait(); //消费者要考虑,篮子中如果馒头空了,那么就要等待生产者,生产馒头。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify(); //将唤醒消费者,吃馒头。
index -- ;
return mt[index];
}
}
//生产者,只需要调用 篮子容器的push方法,便能进行生产了。
class Producer implements Runnable{
public SyncStack ss;
public Producer(SyncStack ss) {
this.ss = ss;
}
@Override
public void run() {
for(int i=0;i<30;i++){ //假设循环生产30个 馒头
StreamedBun sb = new StreamedBun(i);
ss.push(sb);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("生产者:生产了"+sb);
}
}
}
//消费者,只需要调用 篮子容器的pop方法,便能进行消费。
class Consumer implements Runnable{
public SyncStack ss;
public Consumer(SyncStack ss) {
this.ss = ss;
}
@Override
public void run() {
for(int i =0;i<30;i++){
StreamedBun sb = ss.pop();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("消费者:消费了"+sb);
}
}
}