【问题标题】:how to notify waiting main thread from user thread in java?如何从java中的用户线程通知正在等待的主线程?
【发布时间】:2015-01-24 16:46:45
【问题描述】:
class A implements Runnable
{
  public void run()
  {
    try
    {
      Thread.sleep(1000);
    }
    catch(Exception e){};
    notify();//This has to wake up the sleeping main thread.
  }
  public static void main(String args[])
  {
    A a=new A();
    Thread t=new Thread(a);
    t.start();
    try
    {
      Thread.wait(5000);
    }
    catch(Exception e){};
    System.out.println("Rest of the code");
  }
}

当我编译这段代码时,JVM 说不能从静态主方法引用非静态方法等待。

当我把它放在不同的方法中时,它会显示非法监视器异常。

请给我一个解决这个问题的方法。不要建议加入之类的东西。因为我必须单独等待和通知。

【问题讨论】:

  • 听说过缩进吗?您的代码可能会使用一些...按原样,它的可读性不是很高。
  • 我浪费了半个小时尝试使用通知和等待。如果我不能使用连接,我会编写自己的代码来等待线程。这样,我知道它会正确等待。

标签: java multithreading synchronization wait


【解决方案1】:

几件事:

  • wait 方法属于 Object 而不是线程。
  • wait 方法不是静态方法,因此不能使用ClassName.wait
  • 要等待工作,您需要先获取对象的监视器,否则会出现 IllegalMonitorException。

有关等待 api 的详细信息,请参阅this

【讨论】:

  • 因为对象 calss 是所有类的超类,我不能利用它来实现这一点吗???如果是这样,我该怎么做??
  • 是的,但与睡眠不同,等待不是静态方法,因此您需要像 Object obj = new Object(); synchronized(obj) {obj.wait(1111);....} 一样实例化对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多