【后端】JAVA多线程等待唤醒机制的小练习

JAVA多线程等待唤醒机制的小练习

场景概述:
包子铺(生产者)制作两种皮和馅的包子,每5秒制作一个包子,随机皮馅,在包子铺制作包子的线程中,顾客(消费者)无限等待(wait),直到包子制作完成后唤醒(notify)顾客进行吃包子进程。
JAVA知识:
主要练习JAVA多线程的等待唤醒机制。
代码如下:

第一部分是包子类的创建,这个类对象是两个线程共享的数据,所以需要做线程安全方便调用。

public class baozi {

	String pi;
	String xian;
	boolean flag=false;
	
}

第二部分是包子铺类的创建,也就是制作包子的进程

public class baozipu extends Thread {

	
	private baozi bz;
	
	int count=1;
	
	   public baozipu(baozi bz) {
		super();
		this.bz = bz;
	}



	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		while(true){
			synchronized (bz) {
				
				if(bz.flag==true){
					try {
						bz.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				if(count%2==0){
					bz.pi="薄皮";
					bz.xian="猪肉韭菜";
							
				}else{
					bz.pi="冰皮";
					bz.xian="豆沙";
				}
				System.out.println("包子铺正在制作:"+bz.pi+bz.xian+"包子!");
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(bz.pi+bz.xian+"包子已经制作完成!");
				bz.flag=true;
				count++;
				bz.notify();
				System.out.println("#####################################################");
				
				
			}
		}
		
		
	}
	  
	
	
	
}

第三部分是吃货顾客的类,也就是吃包子的进程。

public class chihuo extends Thread{

private baozi bz;
	
	int count=1;
	
	   public chihuo(baozi bz) {
		super();
		this.bz = bz;
	}
	
	   public void run() {
			// TODO Auto-generated method stub
			
			while(true){
				synchronized (bz) {
					
					if(bz.flag==false){
						try {
							bz.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					
					
					System.out.println("吃货正在吃"+bz.pi+bz.xian+"包子!");
					
					
					bz.flag=false;
					
					bz.notify();
					System.out.println("#####################################################");
					
					
				}
			}
			
	   
	   
	   }
	   }

第四部分是demo测试效果主线程类:

public class demo {

	public static void main(String[] args) {
		
		 baozi bz = new baozi();
		 new baozipu(bz).start();
		 new chihuo(bz).start();
		
	}
	
}

运行效果图如下:
运行结果图

发布了30 篇原创文章 · 获赞 0 · 访问量 489

猜你喜欢

转载自blog.csdn.net/zhujile521/article/details/105154872