我正在使用线程编写理发店程序。 目前,我有一个理发师,同时有多个客户。 但是,在第一次运行该程序后,其余客户全都陷入困境。 他们都同时坐下。 有什么我想念的吗? 我的代码是:

public synchronized void enter(Customer cust) {
    custList.add(cust);
       getCut(cust);
     }
      public synchronized void getCut(Customer cust) {    
    try {    
      notify(); 
      wait(); 


      System.out.println("sit down");
      notify();
      if (cashier==0) {
        cashier++;
        wait();
        System.out.println("waiting to pay");
        notify();     
        wait();
        System.out.println("left the room"); 
        chairs++; 
        cust.terminate(); 
      }



    } catch (InterruptedException ie) {}

  }

这是我的理发师部分:

 public synchronized void cut(Barber barb) {

    cashier=0;

    try { 
     if(temp){
       System.out.println(temp);
        temp = false;
        notify();
        wait(); //wait for the customer to be settled in
        System.out.println("go to cus");
        notify(); 
        wait();


        System.out.println("cut cus hair");
        notify(); 

        wait();
        if (cashier==1) {

          System.out.println("got money");
          notify();
          cashier--;

          barbers++;

        }
     }      
    } catch (InterruptedException ie) {}

  }
}
 public synchronized void goCut(Barber barb) {

cashier=0;

try { 
 if(temp){
   System.out.println(temp);
    temp = false;
    notify();
    wait(); 
    System.out.println("walks to cus");
    notify(); 
    wait();


    System.out.println("cut hair");
    notify()

    wait();
    if (cashier==1) {

      System.out.println("got the money");
      notify();
      cashier--;
      barbers++;

    }
 }  

===============>>#1 票数:0

从oracle站点

注意:始终在循环中调用wait,以测试正在等待的条件。 不要以为中断是针对您正在等待的特定条件,还是该条件仍然为真。

请参考保护块多线程

===============>>#2 票数:0

看来您正在使用notify并随机wait

你有

notify();
wait();

getCut方法的开头,它的作用是:

  • 第一个客户端进入,它调用通知,然后等待
  • 第二个客户端进入,它调用notify-从而唤醒第一个客户端,然后等待
  • 第三个客户端进入,它调用通知-结果第二个客户端唤醒,依此类推

相反,您应该使用notify和wake来阻止特定资源(主席)。

private final Object pChairLock = new Object();
private int pAvaliableChairs = 3;

...

// take the resource
synchronized(pChairLock)
{
    // wait until a chair is avaliable
    while(pAvaliableChairs == 0)
    { 
        pChairLock.wait();
    }

    // take sit
    pAvaliableChairs--;
}

// now the current thread 'is sitting'
//  - it can do some work using the resource

// after finishing, release the resource
synchronized(pChairLock)
{
    pAvaliableChairs--;

    // notify all waiting thread that resource is available
    pChairLock.notifyAll();
}

在这种情况下,您可以只使用notify(),但是如果不同的线程正在等待释放资源并占用资源,则调用notify可能会唤醒错误的线程。 不必担心同时唤醒太多线程,因为每个线程都会检查资源是否可用,只有第一个线程能够使用该资源,其余线程将继续等待。

本示例使用三把椅子,但是您只能使用一个(布尔值)或任何其他数字。 您可以对收银员进行同样的操作。

===============>>#3 票数:0

使用下面的代码作为模板(来自Magee&Kramer的教科书)...

  • ProducerConsumer =理发店
  • 创建大小为1的BarberShop
  • get = GiveCut(理发师“吸引”客户并给客户理发)
  • put = getCut(客户要求理发-即“放入”客户要求的理发)

码:

public class ProducerConsumer {
  protected Object[] buf;
  protected int count = 0;
  protected int size;

  public ProducerConsumer(int size) {
    this.size = size;
    buf = new Object[size];
  }

  public synchronized void put(Object o) throws InterruptedException {
    while (count == size) wait();
    buf[count] = o;
    ++count;
    notifyAll();
  }

  public synchronized Object get() throws InterruptedException {
    while (count == 0) wait();
    --count;
    Object o = buf[count];
    buf[count] = null;
    notifyAll();
    return (o);
  }
}

  ask by user2272273 translate from so

未解决问题?本站智能推荐:

4回复

搜索具有多个线程的数组时出现Java锁定/并发问题

我是Java的新手,并尝试编写一个方法,在长数据的2D数组中找到最大值。 该方法在单独的线程中搜索每一行,并且线程保持共享的当前最大值。 每当线程找到大于其本地最大值的值时,它会将此值与共享本地最大值进行比较,并根据需要更新其当前本地最大值和可能的共享最大值。 我需要确保实现适当的同步
1回复

乐观锁-Hibernate的并发问题

我试图了解Hibernate中的Optimistic Lock的作用以及如何正确使用它。 我的第一个问题是,是否只在一个Thread尝试保留一个Object而另一个Thread同时已经更改了同一Object的状态时才抛出异常,还是在乎这两个修改是否正确保存? 当对象链更新且每个Threa
1回复

处理多线程服务上的并发问题

我正在设计一个具有某些静态词典的Web服务(wcf)(即,维护服务器和连接的客户端的某些状态)。 该服务处于单实例模式和多并发状态,如下所示。 有多种操作可以读取和写入此静态变量。 我有一个类级别的锁定对象,每当任何操作尝试访问该特定静态变量时,我试图避免使用锁定的方法就是使用该对象
3回复

Java多线程问题-使用者/生产者模式

试图解决此问题,但事实证明这很困难。 我有两个线程,一个是生产者,另一个是消费者。 全部在单独的类中。 这两个线程独立运行。 生产者将大约8-12个文件夹用于输入。 然后,它会同时转换所有文件,并放置在一个名为“ readyToLoad”的共享文件夹中。 生产者线程完成后,消费者
4回复

多线程:为什么输出这个?这是确定性的吗?

我正在学习编写更好的多线程程序,线程安全和确定性。 我遇到了这段代码 产生以下输出(尝试了~100次) 所以我的第一个问题是, 这个输出是否有保证? 我还观察到,如果我将睡眠改为100它仍会产生相同的输出,但如果我将睡眠改为10则输出变为 第二个问题是, 如果有保证,
1回复

添加更多线程并产生不同结果时,Java程序运行时保持不变

这是我的ConcurrentApp类的代码,这是我的问题的根源: 包含一些帮助程序功能的DCP类的相关代码在这里: 当我在ConcurrentApp中使用线程= 1运行代码时,基于打印语句,我收到以下打印输出到控制台: 其中第一个数字对应于从我的列表中删除的整数(例如,“
1回复

Java同步问题,线程之间进行通信

请看下面的代码。 我知道为什么我不使用“同步”部分,循环永远不会中断,但是我不知道是为什么我使用“同步”部分,循环中断。 似乎与之前发生的原则不符。请帮帮我,非常感谢。
1回复

如何简化尴尬的并发代码?

基本上,这段代码会执行HTTP请求,并且如果HTTP请求超时,它将重置wifi连接(有时必须这样做,这就是原来的方式,我也可以将其与非Android相关,而不是“重置wifi”连接”)。 必须考虑以下特殊情况: 如果当前有1个或多个线程正在执行http请求,则不允许其他线程重置w
5回复

Java并发:锁定效率

我的程序有100个线程。 每个线程都这样做: 1)如果arrayList为空,则向其添加具有某些属性的元素 2)如果arrayList不为空,则遍历在arrayList中找到的元素,如果找到合适的元素(匹配某些属性),则获取它并删除arrayList 这里的问题是,当一个
2回复

Java线程和互斥

我有以下课程来代表银行系统: 监视者的类:BankAccount 名为:用户的类(线程) 称为管理器的类(线程) 和主要方法 我想要实现的是这样的: user1或user2开始提款(每次尝试多次)。 可以说user1首先启动。 如果没有足够的钱