• 多线程——生产者和消费者的问题


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

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

      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]);
                
            }
            
        }
    }
  • 相关阅读:
    How to use Typora efficiently on Ubuntu
    数据结构,滑动窗口,双指针,LeetCode,相关题目汇总
    数据结构,LeetCode位运算相关汇总
    使用proxy解决请求跨域问题
    使用xlsx实现Excel导入
    js 将二维数组转为一维数组
    canvas 实现渐变色填充的三角形
    系统提示xxx不是内部或外部命令
    JS从字符串后面开始取值位,取子串,换行实例
    无法查看chm文件,怎么解决
  • 原文地址:https://www.cnblogs.com/Mindreader/p/5481433.html
Copyright © 2020-2023  润新知