我正在做一些關於多線程的研究,並試圖編寫程序。多線程:爲什麼我的程序以不同的結果終止?
我寫了一個餐廳的程序,模擬並行服務多個客戶:
- 餐廳打開,創建一個服務員,廚師,一些客戶和等待,直到所有的客戶都吃過他們的飯食
- 一位顧客下訂單,並等待他的布爾'吃'成爲真實,然後他通知餐廳
- 服務員等待客戶做出訂單,然後通知廚師
- 廚師等待服務員通知他關於o準備膳食並將顧客的「食用」設爲真
不知何故,我的程序將以大致不同的結果終止。
經過研究我已經完成了,我可以看到兩個終止不同的原因:1)如果我的方法不同步(在我的程序中不是這種情況)。 2),因爲我們不能影響線程資源的分配方式,但是這會導致線程序列中的一些細微差異。但是我的程序終止時存在很大的差異,而不僅僅是線程序列中的小差異:
- 如果有一個客戶,它總是終止正確
- 如果有多個客戶,有時一切都正確,餐廳關閉。但有時會在服務員發出第二次通知後卡住,此時廚師應該接收下一份訂單。它不會終止,線程正在運行,但廚師只是不處理下一個訂單。
有人可以給我任何提示嗎?對於廚師
代碼:
class Chef extends Thread{
private static int _id=1;
private int id;
Order order;
public Chef(){
this.id=_id;
_id++;
order=null;
this.start();
}
@Override
public void run() {
System.out.println("Chef ("+id+") starts to work...");
synchronized(this){
while(order==null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("Chef ("+id+") prepared Order ("+this.order.getId()+")");
Restaurant.customers.get(this.order.getId()-1).served=true;
synchronized(Restaurant.customers.get(this.order.getId()-1)){
Restaurant.customers.get(this.order.getId()-1).notify();
}
order=null;
}
public void prepareOrder(Order order){
this.order=order;
System.out.println("Chef ("+this.id+") prepares order ("+order.getId()+")");
synchronized(this){
this.notify();
}
}
}
的服務員碼(正常工作,一直進行收到的訂單):
class Waiter extends Thread{
private static int _id=1;
private int id;
Order order;
public Waiter(){
this.id=_id;
_id++;
order=null;
this.start();
}
@Override
public void run() {
System.out.println("Waiter ("+this.id+") starts to work...");
synchronized(this){
while(takenOrder==false){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
order=null;
Restaurant.chefs.get(0).prepareOrder(order);
}
public void takeOrder(Order order){
this.order=order;
System.out.println("Waiter ("+this.id+") takes order ("+this.order.getId()+")");
synchronized(this){
this.notify();
}
}
}
沒有代碼,我們只能推測... –
@MrD發佈了一些代碼,現在 – IAM