customer.java

来自「主要是java书上的一些代码」· Java 代码 · 共 126 行

JAVA
126
字号
//: Customer.java

//package g3ds.joop.ch6;

import java.util.*;

//这是一个共享资源类
public class Customer{
	//对顾客编号
	private int number;
	
	public Customer(int number){
		this.number=number;
	}
	
	//模拟某位顾客需要服务
	public void call(){
		System.out.println(getNumber() + " 号客人:服务生——");
		
		//则该位顾客进入待服务清单
		Waiter.list(this);	
	}
	
	//获得顾客编号信息
	public int getNumber(){
		return number;
	}
	
	//测试互斥线程
	public static void main(String[] args){
		//创建多个顾客,并且不连续启动线程,使之更具一般性
		Customer c1=new Customer(1);
		Customer c2=new Customer(2);	
		Customer c3=new Customer(3);
		
		c1.call();
			
		//假设只有2个服务生
		Waiter w1=new Waiter("服务生甲->");
		Waiter w2=new Waiter("服务生乙");
		
		w1.start();
			
		c2.call();
		c3.call();
		
		new Customer(4).call();
		
		c2.call();
		w2.start();
	}
}


//设计服务生为线程类
class Waiter extends Thread{
	//提供清单中待服务顾客的索引号
	private volatile static int index;
	//记录需要服务顾客总数
	private static int total;
	//创建一个ArrayList集合,该类在java.util包中
	private static List customers=new ArrayList();
	
	//这是为整个类提供一个对象锁的变量
	private static Object obj=new Object();
	
	Waiter(String name){
		//把名称传给线程
		super(name);
	}
	
	//重写run方法
	public void run(){
		//开始上班提供服务
		serve();
	}
	
	//设计具体的服务操作
	void serve(){
		Customer c=null;
		
		//上班时间如果有客人需要服务,服务生不能闲着!
		while(true){
			/*同步代码块,用来为所有的服务生调度具体的服务对象*/
			synchronized(obj){
				//如果没有需求就歇着吧
				if(index>=total) break;
						
				//否则就按顺序为顾客服务
				c=(Customer)(customers.get(index));
				
				try{
					Thread.sleep(1000);	
				}catch(InterruptedException e){}
				
				index++;
			}
			
			/*以下为情景设计*/
								
			String str ="正在为 " + c.getNumber() + " 号客人";
			String waiter = getName();
			
			System.out.println(waiter + str + "服务。");
			
			//主动让出CPU
			Thread.yield();
			
			System.out.println(waiter + str + "上菜...");
				
			System.out.println(waiter + str + "斟酒...");
			
			//主动让出CPU	
			Thread.yield();
		}
	}
	
	//设计登记需要服务的顾客
	static void list(Customer customer){
		System.out.println("哎,马上就来——");
		
		customers.add(customer);
			
		total++;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?