2010-04-04 64 views
0

嗨我正在研究睡覺的理髮師問題。隨着優先顧客的到來,他們會在行的前面,他們是下一個理髮。Java線程無法與鏈接表正常工作

我使用的是linkedlist,如果我看到一個優先客戶,我把他放在列表的開頭,如果客戶不是優先級,他會到列表的末尾。然後我調用獲取列表的第一個元素的wantHaircut方法。

我的問題是,客戶正按照他們到達的順序進行處理,而優先客戶必須等待。這是一切發生的代碼。任何想法我做錯了什麼?感謝

public void arrivedBarbershop(Customer c){ 

     if(waiting < numChairs && c.isPriority()){ 
      System.out.println("Customer " + c.getID() + ": is a priority customer - SITTING -"); 
      mutex.up();    
      customer_list.addFirst(c); 
     } 
     else if(waiting >= numChairs && c.isPriority()){ 
      System.out.println("Customer " + c.getID() + ": is a priority customer - STANDING -"); 
      mutex.up(); 
      customer_list.addFirst(c); 
     } 
     else if(waiting < numChairs && !c.isPriority()){ 
      waiting++; 
      System.out.println("Customer " + c.getID() + ": arrived, sitting in the waiting room"); 
      customer_list.addLast(c); 
      customers.up(); // increment waiting customers 

     } 
     else if(waiting >= numChairs && !c.isPriority()) { 

     System.out.println("Customer " + c.getID() + ": went to another barber because waiting room was full - " + waiting + " waiting"); 
     mutex.up(); 
     } 

     if(!customer_list.isEmpty()){ 
     this.wantHairCut(customer_list.removeFirst()); 
     } 

    } 

    public void wantHairCut(Customer c) { 
      mutex.up(); 
      barber.down(); // waits for being allowed in barber chair 
      System.out.println("Customer " + c.getID() + ": getting haircut"); 
      try { 
      /** haircut takes between 1 and 2 seconds **/ 
       Thread.sleep(Barbershop.randomInt(1, 2) * 1000); 
      } catch (InterruptedException e) { } 
      System.out.println("Barber: finished cutting customer " + c.getID() + "'s hair"); 
      c.gotHaircut = true;   
      cutting.up(); // signals cutting has finished 

      /** customer must pay now **/ 
      this.wantToCashout(c);   
    } 
+0

什麼是「numChairs」? – Roman 2010-04-04 15:12:37

+0

這就是等候室裏椅子的數量。如果他們都把客戶留下,除非他是優先客戶,那麼他可以等待。 – user69514 2010-04-04 16:03:32

+0

因爲向量是線程安全的,所以我使用了一個向量而不是鏈表,但是我仍然有同樣的問題。我不知道我做錯了什麼。 – user69514 2010-04-04 16:04:09

回答

1

你必須使用同步的集合:

Collections.synchronizedList(List<Object> list) 

基於參數列表

+0

我不知道我是否做錯了,但這也不起作用... list = Collections.synchronizedList(customer_list); – user69514 2010-04-04 15:54:27

+0

這只是意味着錯誤包含在邏輯 – Frostman 2010-04-04 16:12:46

+0

你是什麼邏輯錯誤是什麼?我似乎無法弄清楚。 – user69514 2010-04-04 16:33:37

0

對我敢肯定的邏輯錯誤是在這裏這個方法返回同步列表instanse:

if(waiting < numChairs && c.isPriority()){ 
     System.out.println("Customer " + c.getID() + ": is a priority customer - SITTING -"); 
     mutex.up();    
     customer_list.addFirst(c); 
    } 
    else if(waiting >= numChairs && c.isPriority()){ 
     System.out.println("Customer " + c.getID() + ": is a priority customer - STANDING -"); 
     mutex.up(); 
     customer_list.addFirst(c); 
    } 

是的,避免複製/粘貼編程!

+0

我似乎沒有發現任何錯誤的代碼上面.... – user69514 2010-04-04 15:29:41

+0

@ user69514:在if/else結構的兩個部分中完全相同的代碼塊。 – Roman 2010-04-04 15:38:51

+0

他們應該做同樣的事情。一個會打印STANDING,另一個打印。一個是如果客戶數量多於椅子,另一個是客戶數量少於椅子。我不明白這是如何導致程序無法正常工作的... – user69514 2010-04-04 15:45:16

0

無論何時修改列表,您都應該將該代碼放在同步塊上。

一種方式做到這一點:

synchronized(customer_list) { 
customer_list.addFirst(c); 
} 

另一個,這樣你就不必代碼,所有的地方:

public synchronized void addCustomerAtStart(Customer c) { 
customer_list.addFirst(c); 
} 

,然後替換該功能。

做同樣的事情,當你做customer.up(),看起來它需要同步,否則你可能會得到很多不一致的行爲。提示:如果您必須同步線程,則可能需要查看CountDownLatch,非常易於使用,可以穩定地進行線程同步。

+0

此解決方案也無法正常工作......我不知道我的錯誤在哪裏...... – user69514 2010-04-04 18:53:50

0

您的代碼將客戶添加到列表中(開始或結束),然後從列表中刪除客戶。該列表最多隻包含一個客戶,因此客戶按照他們添加的順序進行處理。