zoukankan      html  css  js  c++  java
  • 生产者和消费者案例

    关键知识点

    1.wait()方法


    声明:

    public final void wait()
                    throws InterruptedException
    抛出: 
        IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。 
        InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。

    该方法在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待,且当前线程必须拥有此对象监视器。执行该方法时,会发布对此监视器的所有权(释放此监视器的锁,这一点与sleep()休眠不同)并等待,直到被notify等方法唤。

    2.notify()方法


    声明:

    public final void notify()
    抛出: 
        IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。

    该方法是唤醒此对象监视器上等待的某个线程,若所有线程在此对象上等待,则唤醒某其中一个线程,这是任意的。直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程,就是某线程释放锁之后才能够执行唤醒操作。

    package com.manu;
    /*
     * 多线程共享数据
     * 生产者消费者案例
     */
    public class ProducterConsumerDemo {
    	public static void main(String[] args) {
    		Food f = new Food();
    		Producter p = new Producter(f);
    		Consumer  c = new Consumer(f);
    		Thread t1 = new Thread(p);
    		Thread t2 =   new Thread(c);
    		
    		t1.start();
    		t2.start();
    	}
    }
    //生产者
    class Producter implements Runnable{
    	private Food food;
    	public Producter(Food food){
    		this.food = food;
    	}
    	@Override
    	public void run() {
    		for(int i=0; i<10; i++){
    			if(i%2==0){
    //				food.setName("糖醋里脊");
    //				try {
    //					Thread.sleep(500);
    //				} catch (InterruptedException e) {
    //					e.printStackTrace();
    //				}
    //				food.setPrice(20);
    				food.set("糖醋里脊", 20);
    			}else{
    //				food.setName("毛血旺");
    //				try {
    //					Thread.sleep(500);
    //				} catch (InterruptedException e) {
    //					e.printStackTrace();
    //				}
    //				food.setPrice(30);
    				food.set("毛血旺", 30);
    			}
    		}
    	}
    }
    //消费者
    class Consumer implements Runnable{
    	private Food food;
    	public Consumer(Food food){
    		this.food = food;
    	}
    	@Override
    	public void run() {
    		for(int i=0; i<10; i++){
    //			try {
    //				Thread.sleep(500);
    //			} catch (InterruptedException e) {
    //				e.printStackTrace();
    //			}
    //			System.out.println(food.getName()+"-->"+food.getPrice());
    			food.get();
    		}
    	}
    }
    //共享数据
    class Food{
    	private String name;
    	private int price;
    	private boolean flag = true;//true表示只生产不消费,false表示只消费不生产
    	public Food(){
    		super();
    	}
    	public Food(String name, int price){
    		super();
    		this.name  = name;
    		this.price = price;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public int getPrice(){
    		return price;
    	}
    	public void setPrice(int price){ 
    		this.price = price;
    	}
    	public synchronized void set(String name, int price){
    		if(flag == false){//表示只消费不生产
    			try {
    				this.wait();//导致当前线程等待,让出CPU,释放该监视器的锁
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		this.name = name;
    		try {
    			Thread.sleep(500);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		this.price = price;
    		flag = false;
    		this.notify();//唤醒在此对象监视器上等待的单个线程
    	}
    	public synchronized void get(){
    		if(flag){//表示只生产不消费
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		try {
    			Thread.sleep(500);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println(this.getName()+"-->价格:"+this.getPrice());
    		flag = true;
    		this.notify();
    	}
    

    }

  • 相关阅读:
    base64这种编码的意义
    玩2k16
    http://riddle.arthurluk.net walkthrough
    sshfs
    其它技术名称解释
    解决Apache日志"internal dummy connection"方法
    Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)
    php-imagick扩展
    phpinfo空白
    Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解
  • 原文地址:https://www.cnblogs.com/jzmanu/p/10284794.html
Copyright © 2011-2022 走看看