我正在用Java编写一个类来简化从多播组连接,加入,发送和接收数据的过程。在我描述我的问题之前,请先查看下面的示例,这样您就可以了解我在做什么。
这是我正在做的 very 基本代码示例。请注意,它完全不像我的实际代码,有例外捕获,导入语句等等......它只是简单地展示了我的类在如何利用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++;
}
这些流程是否可以并行完成,如果是这样,请您提供一个如何执行此操作的示例?如果没有,还有其他的解决方法吗?
答案 0 :(得分:3)
如果您希望程序同时执行操作,则需要使用线程。 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:如果您的线程在同一个处理器上运行,它们实际上不会同时运行,它们似乎只是这样做。