读书人

java多线程 一个生产者跟多个消费者

发布时间: 2013-01-28 11:49:56 作者: rapoo

java多线程 一个生产者和多个消费者
生产者和消费者模式是面试时很容易被问到的一类题,在平常的开发中也经常碰到,比如在网游开发中:用一个线程把收到的字节数据封装起来写到一个队列中,然后用一个或多个线程从该队列中把数据读取出来再分发。本文来实现类似的情景:5个通宵加班并饿了一天的程序员去包子店吃小笼包,小笼包分为菜包和肉包,随机分配的,由于公司只给报销20个包子的钱,所以就只点了20个包子,包子店的老板娘一次只能蒸10个包子,而且是必须等他们吃完了蒸好的10个包子之后再继续做剩下的10个包子,由于这个世界本身是不公平的,所以抢的快的的就多吃点,但为了避免他们把包子抢烂,规定每次只能一个人去拿包子。
这里生产者就是做包子的,消费者就是这5个饿晕了的coder,下面来看看怎么用代码实现它。
1. 创建包子店BreadShop.java,首先创建一些公用的数据

public static void main(String[] args) {    BreadShop bs = new BreadShop();    // 5个coder来到包子店点包子    for(int i = 0; i < 5; ++ i)    {        Thread t = new Thread(bs.new Consumer(i));        t.start();    }    // 老板娘开始做包子     Thread productThread = new Thread(bs.new Product());    productThread.setPriority(Thread.MAX_PRIORITY);    productThread.start();}

打印的结果如下:
make a meat bread
make a vegetables bread
make a vegetables bread
make a vegetables bread
make a meat bread
make a vegetables bread
make a meat bread
make a meat bread
make a meat bread
make a vegetables bread
AlexZhou 1 eat a meat bread
AlexZhou 3 eat a vegetables bread
AlexZhou 2 eat a vegetables bread
AlexZhou 0 eat a vegetables bread
AlexZhou 4 eat a meat bread
AlexZhou 3 eat a vegetables bread
AlexZhou 1 eat a meat bread
AlexZhou 2 eat a meat bread
AlexZhou 0 eat a meat bread
AlexZhou 4 eat a vegetables bread
make a meat bread
make a meat bread
make a vegetables bread
make a meat bread
make a meat bread
make a vegetables bread
make a meat bread
make a meat bread
make a meat bread
make a meat bread
AlexZhou 1 eat a meat bread
AlexZhou 2 eat a meat bread
AlexZhou 4 eat a vegetables bread
AlexZhou 1 eat a meat bread
AlexZhou 2 eat a meat bread
AlexZhou 3 eat a vegetables bread
AlexZhou 0 eat a meat bread
AlexZhou 4 eat a meat bread
AlexZhou 2 eat a meat bread

AlexZhou 1 eat a meat bread


转载请注明来自:Alex Zhou的程序世界,本文链接:http://codingnow.cn/java/1053.html

读书人网 >编程

热点推荐