2015-07-21 65 views
1

我有兩個CLASS(每個都有一個線程),我想創建一個隊列之間共享的隊列。所以一個類可以將一些字節寫入隊列,另一個類可以從隊列中讀取一些字節。我可以在Java中做'全局共享對象'嗎?

我試過靜態的,這裏是我的代碼:

public class ShareQueueTest { 
public static final BlockingQueue<byte[]> memshare= new ArrayBlockingQueue<>(1000); 
public static void main(String[] args){ 
Thread a = new Thread(){public void run(){ 
    for(;;){ 
    try { 
     memshare.put(new byte[20]); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println(memshare.size()); 
    } 
}}; 
a.start(); 
} 
} 

而另一類就是從這個隊列簡單的讀。

public class ShareQueueTest2 { 
public static void main(String[] args){ 
Thread a = new Thread(){public void run(){ 
    for(;;){ 
     System.out.println(ShareQueueTest.memshare.size()); 
    } 
}}; 
a.start(); 
} 
} 

我運行它。雖然有一個線程將字節放入隊列中,但另一個線程仍然說隊列一直爲空。很明顯,他們被提到不同的事情。

所有的事情都發生在本地機器上。

由於這個問題是從網絡場景中簡化的,所以出於某種原因,我不希望另一個類來操縱這兩個線程,它們彼此都是盲目的。也許他們唯一知道的是每個線程都運行在同一臺本地機器上,另外他們知道另一個線程的端口號。在這種情況下,我需要一些方法來創建一個數據結構,它們都可以「看到」。

我也想到使用內存地址。就像一個類獲取對象的內存地址,另一個類從地址獲取對象並將其轉換爲正確的數據結構。在java中可能嗎?

任何幫助將不勝感激!

回答

2

由於這兩個類裏有一個主要方法,你似乎可以從ShareQueueTest運行在單獨的進程這兩個類(JVM的實例)

如果調用ShareQueueTest2.main(...) .main,它應該可以工作

+0

這2個線程不應該能夠看到對方。理想情況下他們應該是獨立的。 – fTTTTT

+0

@fTTTTT以下是事情:只有在同一進程中的線程才能共享內存項目。如果你需要你的線程獨立處理,你應該考慮使用數據庫和/或JMS(Java消息傳遞) – ControlAltDel

+0

所以這意味着,如果我想讓這兩個線程共享一個對象,無論它是什麼,這2個線程應該至少在同一班上創建? – fTTTTT

1

如果分別調用這兩個類,它將生成兩個單獨的JVM,它們是兩個單獨的進程。線程無法通過共享隊列在進程間進行通信。

您需要從其他答案指出的相同代碼中啓動兩個線程。然後,您可以訪問共享變量並查看一個線程所做的更改會反映到另一個線程中。

0

試試這個:

public class ShareQueueTest { 
public static final BlockingQueue<byte[]> memshare= new ArrayBlockingQueue<>(1000); 
public static void subMain(String[] args){ 
Thread a = new Thread(){public void run(){ 
    for(;;){ 
    try { 
     memshare.put(new byte[20]); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println(memshare.size()); 
    } 
}}; 
a.start(); 
} 
} 

public class ShareQueueTest2 { 
public static void subMain(String[] args){ 
Thread a = new Thread(){public void run(){ 
    for(;;){ 
     System.out.println(ShareQueueTest.memshare.size()); 
    } 
}}; 
a.start(); 
} 
} 

public class Launch 
{ 
    public static void main(String[] args) 
    { 
    ShareQueueTest1.subMain(args); 
    ShareQueueTest2.subMain(args); 
    } 
} 
+0

但關鍵是這兩個線程不應該能夠看到對方,也不應該被第三方線程操縱,我指的是您提供的方法實際上使用第三方線程 – fTTTTT

+0

這些線程必須由第三方。他們不能啓動自己。在你的代碼中,這兩個線程中的每一個都是由不同於自己的線程啓動的。另外,「無法看到對方」是什麼意思?在您的代碼中,ShareQueueTest2正在「看到」該行中的另一個線程:System.out.println(ShareQueueTest.memshare.size()); –

相關問題