理解线程的不错的例子
以下是Thanking in Java 上的关于线程之间的协作关系的一段代码,
程序简单,是理解多线程之间协作的一个典型的例子;
就我的理解与大家分享,不妥之处,望纠正!
order 订单 waitperson 服务员 Chef 厨师
服务员必须等待厨师做好菜后才能够去端菜,当厨师做好菜后,通知服务员,服务员端菜送上餐桌后,回来继续等待。
class Order {
private static int i=0;
private int count=++i;
public Order(){
if(count==10){
System.out.println("Out of food,closing");
System.exit(0);
}
}
public String toString(){
return "Order "+count;
}
}
class WaitPerson extends Thread{
private Restaurant restaurant;
public WaitPerson(Restaurant r){
restaurant = r; //将main中的restaurant赋值进来,往下执行。
start();
}
public void run(){
while (true){
while (restaurant.order==null)
synchronized(this){ //此处的加锁,使得waitperson等待,程序跳转到main中执行最后一句。
try{
wait();//程序从notify()跳转到此处,程序往下执行。
}catch(InterruptedException ie){
throw new RuntimeException(ie);
}
}
System.out.println(
"Waitperson got "+restaurant.order );
//输出,程序转到Order的toString();然后输出,回到此处,程序继续往下执行。
//此时相当于完成这样一个过程:一个等待的服务员,做好菜的厨师叫这个服务员送菜
//(及此处的输出)。
restaurant.order=null;//赋空值给restaurant.order 很关键,这样的赋值使得
//刚送完菜的服务员又回来等待,程序跳转到上面 判断到restaurant.order==null
//故加锁 服务员等待。即重复上面的过程。此时程序跳转到 chef的notify()后面,
//继续执行。重复此过程。
}
}
}
class Chef extends Thread{
private Restaurant restaurant;
private WaitPerson waitperson;
public Chef(Restaurant r,WaitPerson w){
restaurant = r; //赋值后程序往下执行。
waitperson = w;
start();
}
public void run(){
while(true){
if(restaurant.order==null){ //此处是关键所在,因为main中实例化一个Restaurant
//对象,只是声明一个order,但没有定义。
restaurant.order = new Order();//实例化一个Order,同时调用其构造函数判断是否
//满足退出程序的条件 及是否count==10 ,如果满足条件程序退出,否则,程序往下
//继续执行。
System.out.print("Order Up! ");//
synchronized(waitperson){
waitperson.notify();//唤醒前面的wait();程序跳转到wait()处。
}
}
try{
sleep(1000);
}catch(InterruptedException ie){
throw new RuntimeException(ie);
}
}
}
}
public class Restaurant extends Thread {
Order order;
public static void main(String[] args) {
// TODO Auto-generated method stub
Restaurant restaurant = new Restaurant();
// 程序从这里开始,实例化一个Restaurant对象,声明一个order,但没有定义
WaitPerson waitperson = new WaitPerson(restaurant);
//调用WaitPerson的构造方法 程序跳转到WaitPerson构造方法
Chef chef = new Chef(restaurant,waitperson);
//调用Chef的构造方法,同时赋值, 程序跳转到Chef构造方法,
}
}
结果:
Order Up! Waitperson got Order 1
Order Up! Waitperson got Order 2
Order Up! Waitperson got Order 3
Order Up! Waitperson got Order 4
Order Up! Waitperson got Order 5
Order Up! Waitperson got Order 6
Order Up! Waitperson got Order 7
Order Up! Waitperson got Order 8
Order Up! Waitperson got Order 9
Out of food,closing
问题点数:0、回复次数:1Top
1 楼zpc10(张三)回复于 2006-07-04 18:15:57 得分 0
嗯,精神可嘉,特提出表扬!Top




