线程间的通信

本文介绍了一个典型的生产者消费者模式实现,通过线程间通信确保生产者与消费者之间的协调工作。生产者生产水果,若水果已存在则等待;消费者购买水果,若无水果则等待。双方通过共享对象的wait和notify方法进行同步。
摘要由CSDN通过智能技术生成
package com.cn.tongxun;
/**
 * 线程间的通信问题:
 * 消费者和生产者:
 * 生产者生产水果,如果水果没有被买走那么就不生产,处于等待状态,如果水果被消费者
 * 买走的时候,消费者会通知生产者告诉他我们已经把水果买走了,请生产;消费者同理,如果
 * 水果已经生产出来那么就买走,买走之后在通知生产者水果已经没有了请生产。
 * 注意:①线程间的通信共享数据一定要有同步代码快synchronized
 * 	   ②一定要有wait和notify,而且两者一定成对出现
 * 	   ③生产者和消费者的线程实现一定是在while(true)【死循环】里面
 * @author Administrator
 *
 */
public class Client {

	public static void main(String[] args) {
		Frult f = new Frult();
		f.setName("苹果");
		f.setExsit(false);
		
		ProductFruit pt = new ProductFruit(f);
		BuyFruit bt = new BuyFruit(f);
		
		Thread t1 = new Thread(pt);
		Thread t2 = new Thread(bt);
		
		t1.start();
		t2.start();
		
	}
	
}

package com.cn.tongxun;
/**
 * 水果类
 * @author Administrator
 *
 */
public class Frult {

	private String name;
	
	private boolean isExsit;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean isExsit() {
		return isExsit;
	}

	public void setExsit(boolean isExsit) {
		this.isExsit = isExsit;
	}
	
	
}

package com.cn.tongxun;
/**
 * 生产者 
 * @author Administrator
 *
 */
public class ProductFruit implements Runnable{

	private Frult fruit;
	
	public ProductFruit(Frult fruit) {
		super();
		this.fruit = fruit;
	}



	@Override
	public void run() {
		while(true){
			//有共享的数据,多个线程作共享的数据,必须使用锁
			synchronized(fruit){
				//如果水果已经存在,那么生产者就不生成水果,等待着消费者买走再生成
				if( fruit.isExsit()){
					
					try {
						//当前生成水果的线程被挂起,变成阻塞状态
						fruit.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(fruit.getName()+"水果被生产出来");
				//把水果的状态变成存在
				fruit.setExsit(true);
				//唤醒等待卖水果的线程
				fruit.notify();
			}
			
			
		}
		
	}

	
	
}

package com.cn.tongxun;
/**
 * 消费者
 * @author Administrator
 *
 */
public class BuyFruit implements Runnable{

	private Frult fruit;
	
	public BuyFruit(Frult fruit) {
		super();
		this.fruit = fruit;
	}
	
	
	@Override
	public void run() {
		while(true){
			//有共享的数据,多个线程作共享的数据,必须使用锁
			synchronized(fruit){
				
				if(!fruit.isExsit()){
					try {
						//当前生成水果的线程被挂起,变成阻塞状态
						fruit.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(fruit.getName()+"水果被买走");
				fruit.setExsit(false);
				//唤醒生产者线程
				fruit.notify();
				
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值