Java Multicast получает данные и параллельную обработку - PullRequest
1 голос
/ 09 декабря 2011

Я пишу класс на Java, чтобы упростить процесс подключения, присоединения, отправки и получения данных из многоадресной группы. Пожалуйста, взгляните на образец ниже, прежде чем я опишу свой вопрос, просто чтобы вы имели представление о том, что я делаю.

Вот очень базовый пример кода того, что я делаю. Обратите внимание, что он совсем не похож на мой реальный код, с перехватом исключений, операторами импорта и т. Д. ... он просто показывает основной поток моего класса в том, как он использует многоадресные возможности Java:

//Connect to the multicast host, and join the group
  MulticastSocket msConn = new MulticastSocket(5540);
  InetAddress netAddr = InetAddress.getByName("239.255.255.255");
  msConn.joinGroup(netAddr);

//Preapre a datagram packet in which to place recieved data
  byte buf[] = new byte[1024];
  DatagramPacket pack = new DatagramPacket(buf, buf.length);

//Code halts here until data is recieved
  msConn.recieve(pack);

Обратите внимание, что в методе receive() код останавливается до тех пор, пока многоадресный класс не получит пакет данных. Я бы хотел, чтобы Java постоянно прослушивала новые данные и одновременно выполняла этот код:

int i = 0;

while(true) {
  System.out.print(i);
  i++;
}

Могут ли эти процессы выполняться параллельно, и, если да, не могли бы вы привести пример, как это сделать? Если нет, есть ли другая работа вокруг?

1 Ответ

3 голосов
/ 09 декабря 2011

Если вы хотите, чтобы ваша программа работала одновременно, вам понадобятся потоки. 1

Самый простой способ (не вдаваясь в анонимные классы и т. Д.), Вероятно, состоит в том, чтобы разделить один или другой ваш процесс на отдельный класс, который реализует Runnable. Например, создайте класс Counter следующим образом:

public class Counter implements Runnable {
    public void run ( ) {
        int i = 0;
        while(true) {
            System.out.print(i);
            i++;
        }
    }
}

Затем, перед вашим другим кодом, вы создадите новый Thread следующим образом:

Counter counter = new Counter( );
Thread thread = new Thread(counter);
thread.start( );
...
// The rest of your code goes here...

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

Это действительно просто царапина на поверхности резьбы. Это гораздо больше, чем я могу дать в ответе, поэтому я настоятельно рекомендую прочитать связанные документы, прочитать статью thread в Википедии и найти другую информацию, чтобы получить лучшее представление о том, как это работает.


1: Если ваши потоки работают на одном и том же процессоре, они на самом деле не будут работать одновременно, они просто будут казаться таковыми.

...