2015-07-21 2 views
1

У меня есть два КЛАСС (у каждого есть поток), и я хочу создать очередь, разделяемую между ними. Таким образом, один класс может записать несколько байтов в очередь, а другой может читать из очереди SAME.Могу ли я сделать глобальный общий объект в 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

Поскольку оба ваших классов есть основной метод, кажется, что вы можете работать эти два класса в отдельных процессах (экземпляры JVM)

Если вы звоните ShareQueueTest2.main (...) от ShareQueueTest .main, он должен работать

+0

Эти 2 нити не должны быть в состоянии видеть друг друга. В идеале они должны быть независимыми. – fTTTTT

+0

@fTTTTT Вот что: только потоки в одном процессе могут совместно использовать элементы памяти. Если вам нужно, чтобы ваши потоки были независимыми от процесса, вы должны подумать об использовании базы данных и/или JMS (Java Messaging) – ControlAltDel

+0

Так что это означает, что если я хочу, чтобы эти 2 потока совместно использовали объект, что бы это ни было, эти 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

Но ключ состоит в том, что эти 2 потока не должны видеть друг друга, и ни один из них не должен обрабатываться сторонним потоком, в котором я имею в виду, что метод, который вы предоставили, фактически использует стороннюю сторону. – fTTTTT

+0

. Этими потоками ДОЛЖНЫ управлять Третья сторона. Они не могут запускать себя. В вашем коде каждый из этих 2 потоков также запускается нитью, отличной от самих себя. Кроме того, что означает «неспособность видеть друг друга»? В вашем коде ShareQueueTest2 «видит» другой поток в строке: System.out.println (ShareQueueTest.memshare.size()); –