zoukankan      html  css  js  c++  java
  • 实验题目:用Java的等待/通知机制实现“厨师—食 者”问题。假设分别有4位厨师和6位食者。厨师做一盘 菜的时间为4s,食者吃一盘菜的时间为3s。编程实现这 一功能,参考“生产者—消费者”问题。

    Food类

    package cook_eat;
    
    public class Food {
    
    }
    

      

    Cook类

    package cook_eat;
    
    public class Cook extends Thread{
    
    	private Table table;
    	
    	public Cook(Table table) {
    		this.table = table;
    	}
    
    	@Override
    	public void run() {
    		while(true) {
    			// 做菜
    			Food food = new Food();
    			// 需要四秒
    			try {
    				Thread.sleep(4000);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			// 上菜
    			table.putFood(food);
    		}
    	}
    	
    }
    

      

    Eater类

    package cook_eat;
    
    public class Eater extends Thread{
    
    	private Table table;
    	
    	public Eater(Table table) {
    		this.table = table;
    	}
    	
    	@Override
    	public void run() {
    		while(true) {
    			// 吃菜
    			Food food = table.getFood();
    			// 需要三秒
    			try {
    				Thread.sleep(3000);
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    

      

    Table类

    package cook_eat;
    
    import java.util.LinkedList;
    
    class Table extends LinkedList<Object> {
    	int maxSize; // 容器的最大容量
     
    	public Table(int maxSize) {
    		this.maxSize = maxSize;
    	}
    	public synchronized void putFood(Food f) { // 向容器内放置食品
    		
    		while (this.size() >= this.maxSize) {
    			try {
    				System.out.println("The table is too full,wait a moment!");
    				wait();
    			} catch (Exception e) {
    			}
    		}
    		this.addLast(f);
    		System.out.println("厨师上一份菜,现在桌上还有有"+this.size()+"份菜");
    		notifyAll();
    	}
     
    	public synchronized Food getFood() { // 从容器内取食品
    		Food f;
    		while (this.size() <= 0) {
    			try {
    				System.out.println("There is no food now ,come here later!");
    				wait();
    			} catch (Exception e) {
    			}
    		}
    		f = (Food) this.getFirst();
    		this.remove(f);
    		System.out.println("食客吃了一份菜,现在桌上有"+this.size()+"份菜");
    		notifyAll();
    		return f;
    	}
    }
    

      

    Test类

    package cook_eat;
    
    public class Test {
    
    	public static void main(String[] args) {
    		// 假定一开始桌上有六道菜
    		Table table = new Table(6);
    		// 厨师开始做菜
    		new Cook(table).start();
    		new Cook(table).start();
    		new Cook(table).start();
    		new Cook(table).start();
    		// 食客开始吃菜
    		new Eater(table).start();
    		new Eater(table).start();
    		new Eater(table).start();
    		new Eater(table).start();
    		new Eater(table).start();
    		new Eater(table).start();
    	}
    
    }
    

      

  • 相关阅读:
    Graylog安装操作
    CF1012C Hills
    MySQL 加锁处理分析
    2.22考试
    int(1)和int(11)是否有区别?
    「LibreOJ NOI Round #1」验题
    MySQL一致性非锁定读
    [学习笔记]凸优化/WQS二分/带权二分
    MySQL latch小结
    [八省联考2018]林克卡特树lct——WQS二分
  • 原文地址:https://www.cnblogs.com/mjn1/p/12560016.html
Copyright © 2011-2022 走看看