正确使用wait和notify

时间:2011-09-11 11:35:30

标签: java multithreading

我编写了一个程序来理解wait()和notify()方法。但是当我运行该程序时,它会挂起并且没有任何反应。基本上我想要一个线程(ThreadDemo)来完成它的执行(显示它的输出),然后其他线程应该显示它的输出(ThreadDemo2)。

由于wait和notify要求使用相同的对象,我创建了公共类LogicClass。

请指出我的代码中有什么问题?我必须在我的项目中使用这些概念。

Program Link

3 个答案:

答案 0 :(得分:2)

在代码中,我至少注意到两个问题:

  • 您的主要功能不会等待子线程加入,因此将退出。使用Thread :: join。
  • 您永远不会调用包含show()的{​​{1}}函数。

答案 1 :(得分:1)

非常确定当主线程退出时,非守护程序线程不会退出。

我建议尽可能使用java.util.concurrent包。它使多线程不易出错。您缺少例如错过的通知警卫,可能导致永久等待。如果您使用闩锁,它将解决该问题。

**编辑

对不起我应该说你现有的错过通知保护(LogicClass中的值)可能会出现无法正常运行的情况 - 等待或通知之前的while循环不足以保证哪个线程“赢得比赛”监视器。

答案 2 :(得分:0)

我之前发表了一篇评论,说明如何缩短代码,同时仍然展示相同的行为。您可以看到一个线程正在运行show,另一个正在运行display

class ThreadMain {
  public static void main(String[] args) {
    final LogicClass lg = new LogicClass(true);

    new Thread(new Runnable() {
      public void run() {
        System.out.println("In threadDemo run method");
        lg.show(10);
      }
    }).start();

    new Thread(new Runnable() {
      public void run() {
        System.out.println("In thread2 run method");
        lg.display(5);
      }
    }).start();
    System.out.println("Hi, in main");
  }
}


class LogicClass {
  boolean value;

  public LogicClass(boolean value) {
    this.value = value;
  }

  synchronized void show(int a) {
    if (value) {
      for (; a != 0; a--)
        System.out.println("This Output should come first");
      value = false;
      notifyAll();
    }
  }

  synchronized void display(int a) {
    while (value) {
      try {
        this.wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

    for (; a != 0; a--)
      System.out.println("This should come later");
  }
}