生产者与消费者-N:1-基于list

多个生产者/一个消费者:

  

 1 /**
 2  *    生产者
 3  */
 4 public class P {
 5     
 6     private MyStack stack;
 7     
 8     public P(MyStack stack) {
 9         this.stack = stack;
10     }
11     
12     public void pushService() {
13         stack.push();
14     }
15 }
 1 /**
 2  *    消费者
 3  */
 4 public class C {
 5     
 6     private MyStack stack;
 7     
 8     public C(MyStack stack) {
 9         this.stack = stack;
10     }
11     
12     public void popService() {
13         System.out.println("pop = " + stack.pop());
14     }
15 }
 1 /**
 2  *    模拟栈
 3  */
 4 public class MyStack {
 5     private List<Object> list = new ArrayList<>();
 6     
 7     public synchronized void push() {
 8         try {
 9             while(list.size() == 1) {
10                 this.wait();
11             }
12             list.add(""+Math.random());
13             this.notifyAll();
14             System.out.println("push:" + list.size());
15         } catch (InterruptedException e) {
16             e.printStackTrace();
17         }
18     }
19     
20     public synchronized String pop() {
21         String value = "";
22         try {
23             while(list.size() == 0) {
24                 System.out.println("pop 操作中:" + Thread.currentThread().getName() + "wait状态");
25                 this.wait();
26             }
27             value = ""+list.get(0);
28             list.remove(0);
29             this.notifyAll();
30             System.out.println("pop:" + list.size());
31         } catch (InterruptedException e) {
32             e.printStackTrace();
33         }
34         return value;
35     }
36 }
 1 /**
 2  *    生产者线程
 3  */
 4 public class P_Thread extends Thread {
 5     
 6     private P p;
 7     
 8     public P_Thread(P p) {
 9         this.p = p;
10     }
11     
12     @Override
13     public void run() {
14         while (true) {
15             p.pushService();
16         }
17     }
18 }
 1 /**
 2  *    消费者线程
 3  */
 4 public class C_Thread extends Thread {
 5     
 6     private C c;
 7     
 8     public C_Thread(C c) {
 9         this.c = c;
10     }
11     
12     @Override
13     public void run() {
14         while (true) {
15             c.popService();
16         }
17     }
18 }
 1 /**
 2  *    测试类
 3  */
 4 public class Run {
 5 
 6     public static void main(String[] args) {
 7         MyStack stack = new MyStack();
 8         P p1 = new P(stack);
 9         P p2 = new P(stack);
10         P p3 = new P(stack);
11         C c1 = new C(stack);
12         
13         P_Thread pThread1 = new P_Thread(p1);
14         P_Thread pThread2 = new P_Thread(p2);
15         P_Thread pThread3 = new P_Thread(p3);
16         C_Thread cThread1 = new C_Thread(c1);
17         
18         pThread1.start();
19         pThread2.start();
20         pThread3.start();
21         cThread1.start();
22     }
23 }

运行结果如下:

  

 

转载于:https://www.cnblogs.com/wang1001/p/9561642.html

基于事件系统风格实现一个购物程序,该程序能模拟顾客订购、店铺发货、快递员送货、客户取件等一系列事件。具体要求如下: 顾客发出订单(Order Event),订单包含顾客、店铺以及订购物品信息,系统自动生成唯一的订单号; 店铺接受顾客的订单,记录订单数,并发出送货请求(Delivery Event); 空闲的快递员接单,变为送货状态,商品送达顾客后,通知顾客取件(Pickup Event),注意:休假状态的快递员不参送货; 顾客可以确认提货(Acknowledge Event)或拒收(Reject Event),前者视为好评,后者视为差评;无论顾客是否拒收,快递员都将变回空闲状态,可以再次接单,同时记录送货次数; 商铺记录顾客评价,流程结束; 打印所有未休假的快递员的送货次数; 打印所有店铺的好评率。 程序关键代码: public class Main { public static void main(String[] args) { /* * 输入代码,请保留 * 数组inputs对应控制台输入,inputs[i]对应于输入的第n行 * inputs[0]: customer-顾客,数据格式为:账号1,姓名,账号2,姓名,…… * 顾客的账号首字母代表顾客类型,账号首字母为B的顾客在取件时会给差评Bad,而其它顾客取件时会给好评Good * inputs[1]: shop-店铺,数据格式为:账号1,店名,账号2,店名,…… * inputs[2]: delivery man-快递员,数据格式为:账号1,姓名,状态,账号2,姓名,状态,…… * 快递员的状态:0-休假,1-空闲,2-送货;当快递员处于休假或送货状态时,不接受订单,送货完成后传换为空闲状态 * inputs[3]: order-订单,数据格式为:客户,商铺,订购内容,顾客,商铺,订购内容,…… * 输入订单时顾客商铺均用序号表示,例如:1,2,shoes表示1号顾客订购了2号商铺的商品shoes * */ Scanner sc = new Scanner(System.in); String[] inputs = new String[4]; for(int i=0;i<inputs.length;i++){ inputs[i]=sc.nextLine(); } sc.close(); Customer[] customers; Shop[] shops; DeliveryMan[] deliverymen; //按格式处理输入数据 ... //顾客按输入的订单发出订购事件,其余各类事件的流程将在发出订单之后自动完成 for (int i=0;i<n;i++) { ... customers[...].order(shops[...], ...); } /* 启动事件分谴线程,该线程将打印收到的每一个事件,事件包括: * 顾客发出的订购(Order)事件,店铺发出的发货(Delivery)事件, * 快递员发出的取件(Pickup)事件,顾客发出的确认收货(Acknowledge)或拒绝收货(Reject)事件 * 输出格式:事件类型 Event: 事件序号 */ EventDispatcher dispatcher = EventDispatcher.getInstance(); new Thread(dispatcher).start(); //等待100ms左右,等待事件分谴线程处理完成所有事件 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //打印所有未休假快递员的送货情况,输出格式:Deliveryman(账号,姓名): 送货次数 for (int i=0;i<deliverymen.length;i++) if (!deliverymen[i].isOff()) deliverymen[i].print(); //打印所有店铺的销售情况,输出格式:Shop(账号,店名): 好评百分比 for (int i=0;i<shops.length;i++) shops[i].print(); System.exit(0); } 输入样例: A1,Jack,B2,Tom S1,AT,S2,LN D1,Jerry,1,D2,Simpson,0,D3,Harry,1 1,1,shoes,1,1,coats,2,1,shirts,1,2,books 输出样例: Order-1: Jack(A1) buys shoes from AT(S1) Order Event: 1 Order-2: Jack(A1) buys coats from AT(S1) Order Event: 2 Order-3: Tom(B2) buys shirts from AT(S1) Order Event: 3 Order-4: Jack(A1) buys books from LN(S2) Order Event: 4 Shop-S1: Order-1 Sent out Delivery Event: 5 Shop-S1: Order-2 Sent out Delivery Event: 6 Shop-S1: Order-3 Sent out Delivery Event: 7 Shop-S2: Order-4 Sent out Delivery Event: 8 Deliveryman-D1: Order-1 Arrived Pickup Event: 9 Deliveryman-D3: Order-2 Arrived Pickup Event: 10 Customer-A1: shoes(AT) ~ Good Acknownledge Event: 11 Customer-A1: coats(AT) ~ Good Acknownledge Event: 12 Deliveryman-D1: Order-3 Arrived Pickup Event: 13 Deliveryman-D3: Order-4 Arrived Pickup Event: 14 Customer-B2: shirts(AT) ~ Bad Rejection Event: 15 Customer-A1: books(LN) ~ Good Acknownledge Event: 16 Deliveryman(D1,Jerry): 2 Deliveryman(D3,Harry): 2 Shop(S1,AT): 67% Shop(S2,LN): 100% 代码长度限制 16 KB 时间限制 800 ms 内存限制 64 MB 栈限制 8192 KB 用Java完成代码
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值