从Java的外部类访问非静态方法(Android应用程序)

问题描述:

我正在做Android应用程序,我在做生产者消费者问题。我有以下代码:从Java的外部类访问非静态方法(Android应用程序)

package nu.hci.codemenao; 

import java.util.LinkedList; 
import java.util.List; 
import java.util.Queue; 

public class Resource { 
    public Queue<String> semaphore = new LinkedList<String>(); 

    public synchronized void addString(String commands) { 
     semaphore.add(commands); 
     notify(); 
    } 

    public synchronized String getString() { 

     while(semaphore.isEmpty()) 
      try{ wait();} 
      catch(InterruptedException e){} 
     return semaphore.remove(); 
    } 
} 

我怎么叫addString()getString()从其他类?我有另一个班,放入队列,另一班读出。

我试图使信号量队列和方法静态,但我不能使用notify()wait()(有错误:non static method notify() can not be referenced from static context)。

+1

如果你按照我的回答你的http://stackoverflow.com/a/33202013/913286设计将更加简单,你只需要正确的队列。 –

+0

@GilVegliach,你好,我只是不知道如何在我的问题的上下文中使用Blocking队列 – yerassyl

+0

'BlockingQueue q = new LinkedBlockingQueue ()';你用'q.put(“asdf”)'插入字符串,并用'q.take()'将它们删除(阻塞)。 –

对不起,这是为了评论。我建议不要在任何程序的大部分中使用静态。大多数情况下,静态可以避免。

如果只有将是一个Resource类,那么是的,你可以把静态的,它可以像这样访问:

Resource.getString(); 

或者

Resource.addString("Hello!"); 

但是,如果你想要创建多个Resource实例,那么您需要实例化一个Resource对象并从不同线程访问它,如下所示:

Resource r1 = new Resource(); 
r1.addString("Hello!"); 
String s = r1.getString(); 

add和get语句可以在单独的线程中执行。

踏步

+0

notify()和wait()方法怎么样,如果我声明了我的getString等方法静态然后我得到notify()不能从静态上下文访问的错误 – yerassyl

+0

是的,因为如果一个方法是静态的,那么在该方法中使用的所有东西都必须是静态的。通知和等待方法不是静态的,因为它们与特定的资源对象相关联,当静态不存在时这些对象相关联。对不起,也许有点混乱! – Stepperz96

+0

您只能在静态方法中调用其他静态方法。 'notify()'和'wait()'不是静态的。 [Java Object Docs!](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()) – Stepperz96