[英]SocketChannel: interrupt close all open channels
我有以下情况:
现在我中断线程。 我预计socketB将被中断并关闭,socketA将继续工作。 不幸的是,socketA也将被中断。
知道可能是什么问题吗?
我使用以下测试方法来重现该行为:
private void testServerSocket() throws IOException, InterruptedException
{
final InetSocketAddress address = new InetSocketAddress( "localhost", 12345 );
final ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind( address );
final SocketChannel socketChannel = serverChannel.accept();
// start communication in new thread
final Thread thread = new Thread( new Runnable() { @Override public void run() { testWrite( socketChannel ); } } );
thread.start();
// wait a little bit
Thread.sleep( 5000 );
// interrupt thread, will interrupt the socketChannel.read in testRead()
thread.interrupt();
thread.join();
socketChannel.close();
serverChannel.close();
}
void testWrite( SocketChannel socketA )
{
try
{
// write to client
socketA.write( ByteBuffer.wrap( "0123456789".getBytes() ) );
// open new socket to another server
testRead();
// throws ClosedByInterruptException
socketA.write( ByteBuffer.wrap( "0123456789".getBytes() ) );
}
catch( final IOException e )
{
e.printStackTrace();
}
}
void testRead()
{
try
{
final InetSocketAddress address = new InetSocketAddress( "localhost", 12346 );
final SocketChannel socketB = SocketChannel.open( address );
// server doesn't send, so this call will block and interrupted
socketB.read( ByteBuffer.wrap( new byte[10] ) );
socketB.close();
}
catch( final IOException e )
{
e.printStackTrace();
}
}
您需要通过在testRead()
的IOException
之后调用Thread.interrupted()
来清除线程的中断状态。 实际上,您应该捕获ClosedByInterruptException
并在那里执行。 否则,条件仍然存在,并且也会中断写入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.