【问题标题】:Method wait() and notifyAll() is not static方法 wait() 和 notifyAll() 不是静态的
【发布时间】:2013-02-23 06:19:54
【问题描述】:
public synchronized  static int get() {
    while(cheia()==false){
        try{
            wait();
          }
        catch(InterruptedException e){
        }
    }

    if (fila[inicio] != 0) {
        int retornaValor = fila[inicio];
        fila[inicio] = 0;
        inicio++;
        if (inicio == size) {
            inicio = 0;
        }
        notifyAll();
        return retornaValor;
    }
    notifyAll();
    return 0;
}

为什么 wait() 和 notifyAll() 在这段代码中没有运行?

IDE 说:方法 wait()(或 notifyAll)不是静态的?

你能帮帮我吗?

【问题讨论】:

  • 您可以改用ClassName.class.wait()ClassName.class.notifyAll()

标签: java multithreading wait producer-consumer notify


【解决方案1】:

你希望wait 做什么?您必须等待通知某些特定对象,并且这里没有对象。

【讨论】:

  • 他等待用这个方法获取一个变量
     public void run(){ int value=0; for(int i=0;i
                    
                  
                    
                            
                
【解决方案2】:

这是因为你在一个静态方法中,这意味着该方法是在类实例而不是对象实例上执行的。 waitnotify 是实例方法。

改为创建一个对象锁并使用它来执行同步和信令。

private static final Object lock = new Object();

public static int get(){
   synchronized(lock){
      lock.wait();
      lock.notify();
      ...etc
   } 
}

【讨论】:

    【解决方案3】:

    您正在从静态方法调用非静态方法,例如 wait()notifyAll()。你不能做这个。将您的 get 方法更改为此

    public synchronized int get()
    

    【讨论】:

    • 大多数 getter 都是基于实例的,因此静态访问是最好的方法。示例:Toolkit.getDefaultToolkit()Desktop.getDesktop()Runtime.getRuntime()
    • 你是对的。但我不确定 OP 是否想以这种方式使用他的方法,或者他是否正在考虑在对象上使用它。我假设是后者。
    • public void run(){ int value=0; for(int i=0;i
    【解决方案4】:

    类对象上的同步静态方法锁,所以很自然,你可以这样做:

    [youclass].class.wait();
    [youclass].class.notify();
    

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2017-08-21
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多