zoukankan      html  css  js  c++  java
  • 线程 ---- 锁(生产者、消费者)

    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();
                }
            }
        }
    }
  • 相关阅读:
    10.18
    10.16~10.17笔记
    JS
    10.8~10.11
    9.28~9.29
    9.27 代码笔记
    代码复习(9.26)
    9.19 链家
    9.18笔记
    9.17 定位
  • 原文地址:https://www.cnblogs.com/xuewuzhijing95hao/p/7127118.html
Copyright © 2011-2022 走看看