我正在尝试编写一个包含多个UDP connections
(多个DatagramChannel
)的简单Java应用程序。
我使用了选择器并将每个频道注册到OP_READ
。
每个isReadable
键(对于每个通道)将由一个单独的线程处理。
我有一个线程池(ExecutorService
),它将限制线程数(处理从通道读取的线程数)。
我有另一个调度所选键的线程(可读键)。
我的方法失败了,因为下次选择键时,会再次返回一些键,因为thread pool
尚未完成处理。
你有什么建议吗?
这里是我代码的主要部分(我在这里给出了主要逻辑......):
public class CConnectionManager扩展Thread {
私有ExecutorService m_TxExecutor = Executors.newFixedThreadPool(3);
private void waitForReadyChannels() { 而(真) { int readyChannels = 0; 尝试{ readyChannels = m_selector.select(10000); if(0< readyChannels) { 打破; } } catch(IOException e) { System.out.print(" \ n等待准备好的频道时的错误"); } } }
private void handleReadConnection(CConnection连接) {
Thread cRxThread = connection.getRxTread();
if (false == cRxThread.isAlive())
{
CRxTask cRxTask = connection.getRxTask();
m_RxExecutor.execute(cRxTask);
}
}
public void run(){
// go over the selector
while (true) {
waitForReadyChannels();
Set<SelectionKey> keys = m_selector.selectedKeys();
Iterator<SelectionKey> keyIterator = keys.iterator();
while(keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
keyIterator.remove();
CConnection connection = (CConnection) key.attachment();
if (key.isReadable()) {
handleReadConnection(connection);
}
}
}
}