问题描述
- 生产者与消费者问题(JAVA实现)
-
public class TestProducerConsumer{ public static void main(String[] agrs){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); ConSumer c = new ConSumer(ss); new Thread(p).start(); new Thread(c).start(); }}class Woto{ int id; public Woto(int id){ this.id = id; } public String toString(){ return ""Woto:"" + id; }}class SyncStack{ int index = 0; Woto[] w = new Woto[8]; public synchronized void push(Woto wt){ while(index == w.length){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); w[index] = wt; index++; } public synchronized Woto pop(){ while(index == 0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); index--; return w[index]; }}class Producer implements Runnable{ SyncStack ss = null; public Producer(SyncStack ss){ this.ss = ss; } public void run() { for(int i = 0;i<10;i++){ Woto wt = new Woto(i); ss.push(wt); System.out.println(""生产了=""+wt); try { Thread.sleep((int) (Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } }}class ConSumer implements Runnable{ SyncStack ss = null; public ConSumer(SyncStack ss){ this.ss = ss; } public void run() { for(int i = 0;i<10;i++){ Woto wt =ss.pop(); System.out.println(""消费了=""+wt); try { Thread.sleep((int) (Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } } }}
为什么会先出现消费者呢 ?求大神解答
这里很明显是先start生产者 怎么可能先消费者呢
new Thread(p).start();
new Thread(c).start();
解决方案
线程是异步的,不是你先写了谁谁就在前,看最好的效果就是弄2个线程通执行一个方法,,要想同步的只能是在同用一个方法时使用synchronized来修饰方法
解决方案二:
线程本来就是异步的,谁先开始都是可能,这个需要你通过消息队列等来控制,或者消费者启动后,发现没有任务就先等待
解决方案三:
class Producer implements Runnable { ?
?
??? private String producerName = null;?
?
??? private StoreHouse storeHouse = null;?
?
??? public Producer(String producerName StoreHouse storeHouse) {......
答案就在这里:java实现生产者与消费者问题
时间: 2024-09-11 01:15:26