我有两个 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中可以吗?
任何帮助将不胜感激!
答案 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);
}
}