0

我有一个等待 UDP 包的自定义线程。收到后我希望这个线程继续运行并将信息发送到另一个方法。我检查了@Asynchronous 表示法,但这似乎只在 javaEE 中有效。有什么建议么?

4

3 回答 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 回答