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();
    	}
    
    }
    

      

  • 相关阅读:
    B/S架构大文件上传问题
    大文件上传解决方案-支持断点续传的文件上传插件(转)
    前端大文件分片上传
    B/S大文件分片上传
    Web大文件分片上传
    .NET大文件分片上传
    ASP.NET大文件分片上传
    leetCode(37):Implement Queue using Stacks
    poj 3928 Ping pong(树状数组)
    从零開始学Swift之Hello World进化版
  • 原文地址:https://www.cnblogs.com/mjn1/p/12560016.html
Copyright © 2011-2022 走看看