2015-10-18 2 views
0

Я делаю приложение для 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, yeh, я просто не знаю, как использовать блокировку очереди в контексте моей проблемы – yerassyl

+0

'BlockingQueue q = new LinkedBlockingQueue ()'; вы вставляете строки с 'q.put (" asdf ")' и удаляете их (блокируя) с помощью 'q.take()'. –

ответ

0

Извините, это должен быть комментарий. Я бы посоветовал использовать статическую часть большей части любой программы. Большую часть времени можно избежать.

Если только будет один 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 и т. Д. Static, тогда я получаю ошибка, с которой notify() не может быть получен из статического контекста – yerassyl

+0

Да, это потому, что если метод статичен, то все, что используется в этом методе, также должно быть статическим. Методы уведомлений и ожиданий не являются статическими, поскольку они связаны с определенным ресурсным объектом, который, когда статичность не существует. Извините, может быть, немного смущает! – Stepperz96

+0

Вы можете вызвать только другие статические методы в статическом методе. 'notify()' и 'wait()' не являются статическими. [Документы Java Object Docs!] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()) – Stepperz96

 Смежные вопросы

  • Нет связанных вопросов^_^