java生产者与,Java生产者与消费者(上)

生产与消费者模式,是编程中最常用的模式之一,在多线程中应用比较明显。个人理解:在自助餐厅,厨师在不断做菜放桌子上,吃货不断从桌子上拿东西,这中间如果桌子上已经摆满那厨师要暂停工作 ,桌子上已没有食物则吃货要暂停拿东西吃。

先决条件,食材充足,桌子一定。

本程序设计原则:由于synchronized加锁方法,使得内部的所有变量也被加载;我们采取多线程操作,故中间要用sleep,以便其他线程可以使用(windows多线程亦采取同样设计原则),sleep很短的时间,故用户不会有停滞感。为结果清晰,producer和consumer共执行操作50次,则程序停止运行。

桌子:

count,即桌子数量一定,produce和consume均对count操作。当蛋糕数大于等于桌子数时,生产线程要等待;当蛋糕数少于或等于0时,消费线程要等待。notifyAll是唤醒所有线程,如果生产线程watit时,消费线程已经把cake吃光,则要唤醒生产线程,反之亦然,故用notifyAll,而notify仅唤醒当前线程,在这里是没有用的。

public class Table {

private volatile int count;

private int cake;

private int stopCounts;

public Table(int count) {

// TODO Auto-generated constructor stub

this.count = count;

}

public synchronized void produce(String threadName) throws InterruptedException {

while (cake >= count) {

System.out.println(threadName + " begin to wait !");

wait();

System.out.println(threadName + " stop waiting !");

}

System.out.println(threadName + " produce:" + ++cake);

notifyAll();

if (++stopCounts > 50) {

System.out.println(threadName + " stop at last !");

System.exit(0);

}

}

public synchronized void consume(String threadName) throws InterruptedException {

while (cake <= 0) {

System.out.println(threadName + " begin to wait !");

wait();

System.out.println(threadName + " stop waiting !");

}

System.out.println(threadName + " consume:" + cake--);

notifyAll();

if (++stopCounts > 50) {

System.out.println(threadName + " stop at last !");

System.exit(0);

}

}

}

生产者:

生产蛋糕,一次停止1毫秒

public class Producer extends Thread {

Table table;

String threadName;

public Producer(String string, Table table) {

// TODO Auto-generated constructor stub

this.table = table;

this.threadName=string;

this.setName(threadName);

}

@Override

public void run() {

// TODO Auto-generated method stub

super.run();

try {

while (true) {

table.produce(threadName);

sleep(1);

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

消费者:

消费蛋糕,一次停止1毫秒

public class Consumer extends Thread {

Table table;

String threadName;

public Consumer(String string, Table table) {

// TODO Auto-generated constructor stub

this.table = table;

this.threadName=string;

this.setName(threadName);

}

@Override

public void run() {

// TODO Auto-generated method stub

super.run();

try {

while (true) {

table.consume(threadName);

sleep(1);

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

验证程序:

多线程

public class TestCP {

public static void main(String[] args) {

Table table = new Table(5);

Thread p1 = new Producer("Produce1",table);

Thread c1 = new Consumer("Consumer1",table);

Thread p2 = new Producer("Produce2",table);

Thread c2 = new Consumer("Consumer2",table);

p1.start();

c1.start();

p2.start();

c2.start();

}

}

验证结果:

Produce1 produce:1 //Producer1先生产一只cake

Produce2 produce:2 //Producer2得到锁生产一只

Consumer1 consume:2 //Consumer1先消费一只

Consumer2 consume:1 //Consumer2得到锁也消费一只

Consumer1 begin to wait ! //Consumer1得到锁开始等待

Produce1 produce:1 //Producer1开始生产

Produce2 produce:2 // Producer2开始生产

Consumer2 consume:2 //Consumer2开始消费

Consumer1 stop waiting ! //当cake数大于0,Consumer1停止等待

Consumer1 consume:1 //Consumer1开始消费

Consumer1 begin to wait ! //当cake数等于0,Consumer1开始等待

Consumer1 consume:1 //Consumer1开始消费

Consumer1 begin to wait ! //当cake数等于0,Consumer1开始等待

Produce2 produce:1 //..............................

Consumer1 stop waiting !

Consumer1 consume:1

Produce1 produce:1

Consumer2 consume:1

Consumer1 begin to wait !

Consumer2 begin to wait !

Produce1 produce:1

Produce2 produce:2

Consumer2 stop waiting !

Consumer2 consume:2

Consumer1 stop waiting !

Consumer1 consume:1

Consumer2 begin to wait !

Consumer1 begin to wait !

Produce1 produce:1

Consumer1 stop waiting !

Consumer1 consume:1

Consumer2 stop waiting !

Consumer2 begin to wait !

Produce2 produce:1

Consumer2 stop waiting !

Consumer2 consume:1

Consumer2 begin to wait !

Produce1 produce:1

Consumer1 consume:1

Consumer2 stop waiting !

Consumer2 begin to wait !

Produce2 produce:1

Consumer2 stop waiting !

Consumer2 consume:1

Produce1 produce:1

Produce2 produce:2

Consumer2 consume:2

Consumer1 consume:1

Consumer1 begin to wait !

Consumer2 begin to wait !

Produce1 produce:1

Produce2 produce:2

Consumer2 stop waiting !

Consumer2 consume:2

Consumer1 stop waiting !

Consumer1 consume:1

Consumer1 begin to wait !

Produce2 produce:1

Produce1 produce:2

Consumer1 stop waiting !

Consumer1 consume:2

Consumer2 consume:1

Consumer1 begin to wait !

Produce1 produce:1

Consumer2 consume:1

Produce2 produce:1

Consumer1 stop waiting !

Consumer1 consume:1

Consumer2 begin to wait !

Consumer1 begin to wait !

Produce1 produce:1

Consumer1 stop waiting !

Consumer1 consume:1

Consumer2 stop waiting !

Consumer2 begin to wait !

Produce2 produce:1

Consumer2 stop waiting !

Consumer2 consume:1

Consumer2 begin to wait !

Produce2 produce:1

Produce1 produce:2

Consumer1 consume:2

Consumer2 stop waiting !

Consumer2 consume:1

Consumer1 begin to wait !

Produce2 produce:1

Consumer1 stop waiting !

Consumer1 consume:1

Consumer2 begin to wait !

Produce1 produce:1

Produce1 stop at last !

原文:http://blog.csdn.net/reboot123/article/details/22321079

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值