• 线程 ---- 锁(生产者、消费者)


    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();
                }
            }
        }
    }
  • 相关阅读:
    使用VMware 15 安装虚拟机和使用CentOS 8
    .Net工具类--表达式目录树解析DataReader和DataTable
    .Net 获取当前周是第几周
    使用Net Mail发送邮件
    ASP.NET Core 中的 Razor 文件编译
    Sql去重一些技巧
    手动实现一个简单的IOC容器
    Portswigger-web-security-academy:OAth authentication vulnerable
    Portswigger-web-security-academy:ssrf
    Portswigger-web-security-academy:os command injection
  • 原文地址:https://www.cnblogs.com/xuewuzhijing95hao/p/7127118.html
Copyright © 2020-2023  润新知