从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
)。
对不起,这是为了评论。我建议不要在任何程序的大部分中使用静态。大多数情况下,静态可以避免。
如果只有将是一个Resource
类,那么是的,你可以把静态的,它可以像这样访问:
Resource.getString();
或者
Resource.addString("Hello!");
但是,如果你想要创建多个Resource
实例,那么您需要实例化一个Resource
对象并从不同线程访问它,如下所示:
Resource r1 = new Resource();
r1.addString("Hello!");
String s = r1.getString();
add和get语句可以在单独的线程中执行。
踏步
notify()和wait()方法怎么样,如果我声明了我的getString等方法静态然后我得到notify()不能从静态上下文访问的错误 – yerassyl
是的,因为如果一个方法是静态的,那么在该方法中使用的所有东西都必须是静态的。通知和等待方法不是静态的,因为它们与特定的资源对象相关联,当静态不存在时这些对象相关联。对不起,也许有点混乱! – Stepperz96
您只能在静态方法中调用其他静态方法。 'notify()'和'wait()'不是静态的。 [Java Object Docs!](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()) – Stepperz96
如果你按照我的回答你的http://stackoverflow.com/a/33202013/913286设计将更加简单,你只需要正确的队列。 –
@GilVegliach,你好,我只是不知道如何在我的问题的上下文中使用Blocking队列 – yerassyl
'BlockingQueue q = new LinkedBlockingQueue ()';你用'q.put(“asdf”)'插入字符串,并用'q.take()'将它们删除(阻塞)。 –