我可以做全球共享对象'在Java中?

时间:2015-07-21 10:43:22

标签: java oop static global-variables memory-address

我有两个 CLASS (每个都有一个线程),我想创建一个在它们之间共享的队列。因此,一个类可以将一些字节写入队列,另一个类可以从 SAME 队列中读取。

我试过静态,这是我的代码:

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中可以吗?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

由于您的两个类都有一个main方法,看起来您可能在不同的进程(JVM实例)中运行这两个类

如果从ShareQueueTest.main调用ShareQueueTest2.main(...),它应该可以正常工作

答案 1 :(得分:1)

如果分别调用这两个类,它将生成两个独立的JVM,这两个JVM是两个独立的进程。线程无法通过共享队列跨进程进行通信。

您需要从其他答案指出的相同代码中启动两个线程。然后,您可以访问共享变量,并查看由一个线程完成的更改将反映在另一个线程中。

答案 2 :(得分: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);
  }
}