我有兩個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個線程不應該能夠看到對方。理想情況下他們應該是獨立的。 – fTTTTT
@fTTTTT以下是事情:只有在同一進程中的線程才能共享內存項目。如果你需要你的線程獨立處理,你應該考慮使用數據庫和/或JMS(Java消息傳遞) – ControlAltDel
所以這意味着,如果我想讓這兩個線程共享一個對象,無論它是什麼,這2個線程應該至少在同一班上創建? – fTTTTT