2015-07-21 75 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()); –

相关问题