zoukankan      html  css  js  c++  java
  • 多线程——生产者和消费者的问题

    生产者和消费者问题的产生

       生产者和消费者是指俩个不同的线程对象,操作统一资源的情况:生产者负责生产数据,消费者负责消费数据,生产者每生产完一组数据后,消费者  消费一组数据,

      Object对多线程的支持:

       wait();等待被唤醒  notify();唤醒  notifyAll();唤醒所有

    sleep()和wait()的区别:

       sleep()属于Thread类,类似于一个闹钟,只持续一定时间。wait()属于Object类,需要被notify()唤醒,如果不唤醒就会一直等待下去

    具体案例如下:

    /**
     * 
     */
    package com.mindrader.thread;
    
    /**
     * @作者 Mind reader
     * @内容 多线程——生产者和消费者基本案例
     * @项目名 Thread_Demo
     * @日期 2016年5月11日
     * @时间 上午10:49:09
     * 
     */
    public class ThreadDemo2 {
        public static void main(String[] args) {
            Data data=new Data();
            new Thread(new Pro(data)).start();
            new Thread(new Cus(data)).start();
        }
    }
    class Data{//数据
        String name;
        String content;
        boolean exsit=false;//不存在商品
        public synchronized void set(String name,String content) {
            if(exsit==true){
                try {
                    super.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            this.name=name;
            this.content = content;
            super.notify();
            exsit=true;//存在
        }
        
        public synchronized String[] get() {
            if(exsit==false){//不存在就等待
                try {
                    super.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            String[] arr={this.name,this.content};
            
            super.notify();
            exsit=false;
            return arr;
        }
    }
    
    class Pro implements Runnable{//生产者
        Data data;
        public Pro(Data data){
            this.data=data;
        }
        
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (i%2==0) {
                    this.data.set("电脑厂商", "制造电脑");
                }else{
                    this.data.set("手机厂商", "制造手机");
                }
            }
            
        }
    }
    class Cus implements Runnable{//消费者
        Data data;
        public Cus(Data data){
            this.data=data;
        }
        
        @Override
        public void run() {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String arr[];
            for(int i=0;i<100;i++){
                arr=data.get();
                System.out.println(arr[0]+"---------"+arr[1]);
                
            }
            
        }
    }
  • 相关阅读:
    oracle之 RAC Interconnect之HAIP
    oracle12c之 单机12.1.0.1打补丁
    oracle之 oracle database vault(数据库保险库)
    oracle之 12.1.0.1.0 C 在 linux 7 上安装报错处理
    Linux之 xstart调用 x11vnc远程图形化桌面
    oracle之 利用 controlfile trace文件重建控制文件
    oracle之 v$sql_monitor 监视正在运行的SQL语句的统计信息
    用oradebug short_stack及strace -p分析oracle进程是否dead或出现故障
    oralce之 10046对Hash Join分析
    嵌套Golang对象的初始化
  • 原文地址:https://www.cnblogs.com/Mindreader/p/5481433.html
Copyright © 2011-2022 走看看