生产者和消费者

生产者

public class Cooker implements Runnable{
	private String name;
	private Disk disk;
	private String foods[];
	private final Random random=new Random();
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Disk getDisk() {
		return disk;
	}
	public void setDisk(Disk disk) {
		this.disk = disk;
	}
	
	public String[] getFoods() {
		return foods;
	}
	public void setFoods(String[] foods) {
		this.foods = foods;
	}
	public Cooker(String name, Disk disk) {
		this.name = name;
		this.disk = disk;
		foods=new String[]{"馍馍","巧克力","可乐","莴笋","压抑"};
	}
	
	@Override
	public void run() {
		for (int i = 0; i < 30; i++) {
			make();	
		}
	}
	
	/**
	 * 生产
	 */
	public void make(){
		synchronized (disk) {
			if (disk.isEmpty()) {
				int index=random.nextInt(foods.length);
				String f=foods[index];
				disk.setFood(f);
				System.out.println(name+"制作了"+f);
				disk.setEmpty(false);
				disk.notify(); //先唤醒
				try {
					Thread.sleep(2000);
					disk.wait();//再挂起
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}else{
				try {
					disk.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}	
}
消费者

public class Custom implements Runnable{
	private String name;
	private Disk disk;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Disk getDisk() {
		return disk;
	}
	public void setDisk(Disk disk) {
		this.disk = disk;
	}
	@Override
	public void run() {
		//循环
		while (true) {
			eat();
		}
		
	}
	public Custom(String name, Disk disk) {
		this.name = name;
		this.disk = disk;
	}
	
	public void eat(){
		synchronized (disk) {
			if (!disk.isEmpty()) {
				String foods=disk.getFood();
				System.out.println(name+"正在享受"+foods);
				disk.setEmpty(true);
				disk.notify(); //唤醒厨师
				try {
					Thread.sleep(2000);
					disk.wait(); //挂起自己
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				//如果消费者先抢到线程
				try {
					disk.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} //
				
			}
		}
		
	}
}
中间代理

public class Disk {
	private String food;
	private boolean empty; //是否为空

	public String getFood() {
		return food;
	}

	public void setFood(String food) {
		this.food = food;
	}

	public boolean isEmpty() {
		return empty;
	}

	public void setEmpty(boolean empty) {
		this.empty = empty;
	}

	public Disk() {
		empty=true;
	}
	
}
Main方法:

public class Test {
	public static void main(String[] args) {
		Disk disk=new Disk();
		Cooker c=new Cooker("小厨",disk);
		Custom l=new Custom("吃货",disk);
		Thread cot=new Thread(c);
		Thread cut= new Thread(l);
		cut.setDaemon(true);// 后台线程 ,只要所有线程结束,这个线程就自动结束
		cot.start();
		cut.start();
	}
}

用到的方法:wait挂起 挂在线程池中 需要notify唤醒notify() 必须在同步块中,而经常看到的问题sleep和wait方法区别,就很简单了,sleep休眠时间到了会自动启用,而wait需要notify唤醒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值