首页 > 代码库 > 线程 ---- 锁(生产者、消费者)
线程 ---- 锁(生产者、消费者)
Java经典面试题 ----- 生产者消费者
/** * 生产者 消费者问题 * 解释 : wait notify 方法 * sleep 与 wait的区别 * 线程锁机制 */ 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(c).start(); } } class MT{ int id ; MT(int id){ this.id = id; } public String toString(){ return "MT:" + id; } } class SyncStack { int index = 0 ; MT[] mts = new MT[6]; public synchronized void push (MT mt){ if(index == mts.length){ try { this.wait(); }catch(InterruptedException ex){ ex.printStackTrace(); } } this.notify(); mts[index] = mt; index ++; } public synchronized MT pop(){ if(index == 0){ try { this.wait(); }catch(InterruptedException ex){ ex.printStackTrace(); } } this.notify(); index -- ; return mts[index]; } } class Producer implements Runnable{ SyncStack stack = null; public Producer(SyncStack stack) { this.stack = stack; } public void run(){ for(int i = 0 ; i < 20 ; i ++){ MT mt = new MT(i); stack.push(mt); System.out.println("生产了:" + mt); try{ Thread.sleep((int)(Math.random()*200)); }catch(InterruptedException ex){ ex.printStackTrace(); } } } } class Consumer implements Runnable{ SyncStack stack = null; public Consumer(SyncStack stack) { this.stack = stack; } public void run(){ for(int i = 0 ; i < 20 ; i ++){ MT mt = stack.pop(); System.out.println("消费了:" + mt); try{ Thread.sleep((int)(Math.random()*1000)); }catch(InterruptedException ex){ ex.printStackTrace(); } } } }
线程 ---- 锁(生产者、消费者)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。