嗨我正在研究睡觉的理发师问题。随着优先顾客的到来,他们会在行的前面,他们是下一个理发。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);
}
什么是“numChairs”? – Roman 2010-04-04 15:12:37
这就是等候室里椅子的数量。如果他们都把客户留下,除非他是优先客户,那么他可以等待。 – user69514 2010-04-04 16:03:32
因为向量是线程安全的,所以我使用了一个向量而不是链表,但是我仍然有同样的问题。我不知道我做错了什么。 – user69514 2010-04-04 16:04:09