2015-10-18 61 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,你好,我只是不知道如何在我的問題的上下文中使用Blocking隊列 – 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等方法靜態然後我得到notify()不能從靜態上下文訪問的錯誤 – yerassyl

+0

是的,因爲如果一個方法是靜態的,那麼在該方法中使用的所有東西都必須是靜態的。通知和等待方法不是靜態的,因爲它們與特定的資源對象相關聯,當靜態不存在時這些對象相關聯。對不起,也許有點混亂! – Stepperz96

+0

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

相關問題