Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程不能正确使用linkedlist_Java_Multithreading_Synchronization_Linked List - Fatal编程技术网

Java线程不能正确使用linkedlist

Java线程不能正确使用linkedlist,java,multithreading,synchronization,linked-list,Java,Multithreading,Synchronization,Linked List,嗨,我正在研究睡眠理发师的问题。此外,当他们到达时,还拥有优先客户,他们排在队伍的最前面,是下一个理发的人 我使用的是linkedlist,如果我看到一个优先客户,我会将其放在列表的开头,如果该客户不是优先客户,则会将其放在列表的末尾。然后调用wantHaircut方法获取列表的第一个元素 我的问题是,客户正在按照他们到达的顺序进行处理,而优先客户必须等待。下面是所有这些发生的代码。你知道我做错了什么吗?谢谢 public void arrivedBarbershop(Customer c){

嗨,我正在研究睡眠理发师的问题。此外,当他们到达时,还拥有优先客户,他们排在队伍的最前面,是下一个理发的人

我使用的是
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);          
   }
public void-arrivedbershop(客户c){
如果(等待=numChairs&&c.isPriority()){
System.out.println(“Customer”+c.getID()+”:是一个优先级客户-持续-”;
mutex.up();
客户名单。添加优先(c);
} 
else if(等待=numChairs&&!c.isPriority()){
System.out.println(“Customer”+c.getID()+”:去了另一家理发店,因为等候室满了-“+waiting+”waiting”);
mutex.up();
}
如果(!customer\u list.isEmpty()){
this.wantHairCut(customer_list.removeFirst());
}
}
公共无效wantHairCut(客户c){
mutex.up();
barber.down();//等待被允许坐在理发椅上
System.out.println(“客户”+c.getID()+“:理发”);
试一试{
/**理发需要1到2秒钟**/
线程。睡眠(理发店。随机点(1,2)*1000);
}捕获(中断异常e){}
System.out.println(“理发师:剪完客户的头发”+c.getID()+”);
c、 gotHaircut=true;
cutting.up();//表示切割已完成
/**客户必须现在付款**/
本条第3款(c)项;
}

您必须使用同步的集合:

Collections.synchronizedList(List<Object> list)
Collections.synchronizedList(列表)

此方法基于参数列表返回同步列表实例

我很确定逻辑错误在这里:

  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);
  } 
if(等待=numChairs&&c.isPriority()){
System.out.println(“Customer”+c.getID()+”:是一个优先级客户-持续-”;
mutex.up();
客户名单。添加优先(c);
} 

是的,避免复制/粘贴编程

无论何时修改列表,都应该将该代码放在同步块上

一种方法是:

synchronized(customer_list) {
 customer_list.addFirst(c);
}
另一个,这样您就不必到处编写代码:

public synchronized void addCustomerAtStart(Customer c) {
 customer_list.addFirst(c);
}
然后替换这个函数

当您执行customer.up()时,也需要同步,否则可能会出现很多不一致的行为

您甚至不需要使用“mutex.up()”
提示:如果您必须同步线程,您可能需要查看CountDownLatch,它非常易于使用,非常适合线程同步。

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

@user69514:if/else构造的两个部分中的代码块完全相同。它们应该做相同的事情。一个站着打印,另一个坐着打印。一个是如果顾客比椅子多,另一个是如果顾客比椅子少。我不知道这是如何导致程序无法正常运行的…我不知道我是否做错了,但这也不起作用。。。列表=集合。同步列表(客户列表);你知道逻辑错误是什么吗?很遗憾,我没发现有什么错误。候诊室的椅子数是多少。如果它们都被拿走了,除非客户是优先客户,否则他可以站着等待。我使用了向量而不是链表,因为向量是线程安全的,但我仍然有同样的问题。我不知道我做错了什么。