DatagramChannel,Selector和线程池

时间:2014-05-23 08:38:08

标签: java multithreading

我正在尝试编写一个包含多个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);                           
                    }                       
                }

     }
 }

0 个答案:

没有答案