我有一个等待 UDP 包的自定义线程。收到后我希望这个线程继续运行并将信息发送到另一个方法。我检查了@Asynchronous 表示法,但这似乎只在 javaEE 中有效。有什么建议么?
问问题
85 次
3 回答
1
“我有一个等待 UDP 包的自定义线程” - 这就是你的答案,有另一个线程可以处理它们。
我建议看一下Executors。这样,您可以让多个线程处理传入的数据包,而无需自己管理
于 2013-08-29T00:55:17.603 回答
0
另一种方法是使用队列。
等待 UDP 数据包的线程将它找到的数据包放入 BlockingQueue。另一个线程不断地轮询该队列并处理它找到的任何内容。
例如:
public class UdpReceivingThread extends Thread {
private final BlockingQueue<UdpPacket> queue;
public UdpReceivingThread(BlockingQueue<UdpPacket> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
UdpPacket packet = listenForPacket();
queue.put(packet);
}
}
}
和
public class ProcessingThread extends Thread {
private final BlockingQueue<UdpPacket> queue;
public ProcessingThread(BlockingQueue<UdpPacket> queue) {
this.queue = queue; // Same queue instance as in UdpReceivingThread instances!
}
@Override
public void run() {
while(true) {
UdpPacket packet = queue.take();
process(packet);
}
}
}
请注意,这种方法肯定与使用 Executor 有关 - Executor 本质上使用 BlockingQueue 来管理 Runnables,后者包装方法调用以处理 UDP 数据包。这只是另一种方式。
于 2013-08-29T00:52:38.800 回答
0
你可以这样做:
private static final ExecutorService threadPool = Executors.newCachedThreadPool();
InetAddress address = InetAddress.getByName("hostname");
while(true){
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
threadPool.execute(new Runnable(){
public void run(){
processPacket(clientConnection); // write a method to do the packet processing
}
);
}
于 2013-08-29T00:54:38.000 回答