2010-04-04 63 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

您的代码将客户添加到列表中(开始或结束),然后从列表中删除客户。该列表最多只包含一个客户,因此客户按照他们添加的顺序进行处理。