Java 线程无法与链表正常工作

标签 java multithreading synchronization linked-list

嗨,我正在研究理发师 sleep 的问题。此外,当他们到达时,他们会排在队伍的前面,并且是下一个理发的人。

我正在使用链接列表,如果我看到优先客户,我会将他放在列表的开头,如果客户不是优先客户,他会转到列表的末尾。然后我调用 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);          
   }

最佳答案

您必须使用同步集合:

Collections.synchronizedList(List<Object> list)

该方法根据参数列表返回同步的List实例

关于Java 线程无法与链表正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574834/

相关文章:

java - Deque的方法和继承自Queue的方法

python - SQLAlchemy ORM : safely passing objects between threads without manually reattaching?

c# - 使用线程进行数据库操作的最佳方式是什么?

java - 如何保护一种方法免受不同请求的影响

java - 修复 JFrame 中 JPanel 的 JScrollPane 的大小

java - 如何从 Java 应用程序设置 Https 连接

java - 使用 Jackson 在同一文件中使用未知键名处理多个 JSON 对象

multithreading - 在 clojure 中使用 at-at 库时应用程序不退出

java - 即使使用synchronized关键字,线程输出也不一致

synchronization - 使用 WinSCP 将今天的文件从远程目录同步到本地目录