zoukankan      html  css  js  c++  java
  • Java 线程的通讯--生产者和消费者

     

    package 生产者和消费者;
    //消费者
    public class Customer implements Runnable {
    	private Share_resources  rescources=null;
    	public Customer( Share_resources  rescources){
    		this.rescources=rescources;
    	}
    	public void run() {
    		for (int i = 0; i <50; i++) {
    			rescources.popup();
    		}
    	}
    
    }
    
    package 生产者和消费者;
    //生产者
    public class Producer implements Runnable{
    	private Share_resources  rescources=null;
    	public Producer( Share_resources  rescources){
    		this.rescources=rescources;
    	}
    	//共享资源对象
    	public void run() {
    		for (int i = 0; i <50; i++) {
    			if(i%2==0){
    				rescources.push("张三", "男");
    			}else{
    				rescources.push("小花", "女");
    			}
    		}
    	}
    }
    
    package 生产者和消费者;
    //共享资源对象(姓名,性别)
    public class Share_resources {
    	private String name;
    	private String  gender;
    	private Boolean isEmpty=true;//表示共享资源是否为空状态
    	/**
    	 * 生产者向共享资源对象存储数据
    	 * @param name 存储的姓名
    	 * @param gender 存储的性别
    	 */
    	synchronized public void push(String name,String gender){
    		while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获取
    			try {
    				this.wait();//使用同步锁调用,表示当前线程释放同步锁,进入等待池,只能被其他线程唤醒
    				Thread.sleep(10);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		//生产开始-----------------------------
    		this.name=name;
    		this.gender=gender;
    		//生产结束-----------------------------
    		isEmpty=false;//设置共享资源不能为空
    		this.notify();//唤醒一个消费者
    	}
    	/**
    	 * 消费者从共享资源中取出数据
    	 */
    	synchronized public void popup(){
    		try {
    			while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
    				this.wait();
    			}
                 //消费开始------------------------------------
    			Thread.sleep(10);
    			System.out.println(this.name+"---"+this.gender);
    			//消费结束-------------------------------------
    			isEmpty=true;
    			this.notify();//唤醒生产者
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    
    package 生产者和消费者;
    
    public class App {
    	public static void main(String[] args) {
    		//创建生产者和消费者共同的对象
    		Share_resources  resources  =new Share_resources();
    		//启动生产者线程
    		new Thread(new Producer(resources)).start();
    		//启动消费者线程
    		new Thread(new Customer(resources)).start();
    	}
    }
    

     Java5生产者和消费者模式同步锁机制

    package java5_同步锁机制;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    //共享资源对象(姓名,性别)
    public class Share_resources {
    	private String name;
    	private String  gender;
    	private Boolean isEmpty=true;//表示共享资源是否为空状态
    	private final Lock lock=new ReentrantLock();
    	private Condition condition =lock.newCondition();
    	/**
    	 * 生产者向共享资源对象存储数据
    	 * @param name 存储的姓名
    	 * @param gender 存储的性别
    	 */
     public void push(String name,String gender){
    		lock.lock();//获取锁
    		while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获
    			try {
    				condition.await();
    				Thread.sleep(10);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}finally {
    				lock.unlock();//释放锁
    			}
    		}
    		//生产开始-----------------------------
    		this.name=name;
    		this.gender=gender;
    		//生产结束-----------------------------
    		isEmpty=false;//设置共享资源不能为空
    		condition.signal();//唤醒一个消费者
    	}
    	/**
    	 * 消费者从共享资源中取出数据
    	 */
    public void popup(){
    	lock.lock();//获取锁
    		try {
    			while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
    				condition.await();
    			}
                 //消费开始------------------------------------
    			Thread.sleep(10);
    			System.out.println(this.name+"---"+this.gender);
    			//消费结束-------------------------------------
    			isEmpty=true;
    			condition.signal();//唤醒生产者
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			lock.unlock();//释放锁
    		}
    	}
    }
    

     

     

     

  • 相关阅读:
    逆向分析实战
    打印工程内所有方法的调用
    JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
    让input支持 ctrl v上传粘贴图片? 让input支持QQ截图或剪切板中的图像数据(Java实现保存)
    spring4 security 4 +websocket 实现单点登录
    Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示
    spring 4.2.0后jdbcTemplate中不用queryForLong了(之系统升级发现)
    友好解决POI导入Excel文件行是不是为空
    解决POI读取Excel如何判断行是不是为空
    集群: 如何在spring 任务中 获得集群中的一个web 容器的端口号?
  • 原文地址:https://www.cnblogs.com/jiangxifanzhouyudu/p/6668301.html
Copyright © 2011-2022 走看看