2011-07-20 17 views
1

私はAndroidのアプリケーションを開発しています。ソケット上のあるスレッドからノンブロッキング書き込みをしようとしていますが、別のスレッドでブロック読み出しを行っています。私はSocketChannelのドキュメントを見て、正確にconfigureBlockingが何をしているのか把握しようとしています。具体的には、非ブロックSocketChannelを持っていて、socketChannel.socket()で関連するSocketにアクセスすると、Socketも何らかの方法で非ブロック化されていますか?それともブロックしていますか?ノンブロッキングSocketChannelを使用すると、関連するSocketブロッキングはありますか?

つまり、非ブロッキング方向に非ブロックSocketChannelを持ち、その他の方向に関連Socketを使用することで、1つのブロッキング方向と1つの非ブロッキング方向の効果を得ることはできますか?

答えて

0

Socketに関連付けられているSocketChannelがある場合は、InputStreamから直接読み取ることはできません。 IllegalBlockingModeExceptionが得られます。 hereを参照してください。

registeringで非ブロックSocketChannelをブロックし、Selectorにブロックし、select()またはselect(long timeout)を使用してブロックすることができます。それらのメソッドは、通常、登録されたチャンネルが準備完了(またはタイムアウト期限切れ)になるまでブロックします。

チャネルは、セレクタを使用していないスレッドでも非ブロックです。

hereから

変形例:

Selector selector = Selector.open(); 
channel.configureBlocking(false); 

// register for OP_READ: you are interested in reading from the channel 
channel.register(selector, SelectionKey.OP_READ); 

while (true) { 
    int readyChannels = selector.select(); // This one blocks... 

    // Safety net if the selector awoke by other means 
    if (readyChannels == 0) continue; 

    Set<SelectionKey> selectedKeys = selector.selectedKeys(); 
    Iterator<SelectionKey> keyIterator = selectedKeys.iterator(); 

    while (keyIterator.hasNext()) { 
    SelectionKey key = keyIterator.next(); 

    keyIterator.remove(); 

    if (!key.isValid()) { 
     continue; 
    } else if (key.isAcceptable()) { 
     // a connection was accepted by a ServerSocketChannel. 
    } else if (key.isConnectable()) { 
     // a connection was established with a remote server. 
    } else if (key.isReadable()) { 
     // a channel is ready for reading 
    } else if (key.isWritable()) { 
     // a channel is ready for writing 
    } 
    } 
} 
関連する問題