我正在尝试在Android中实现一个将使用蓝牙通信的线程。我希望即使在阻塞I / O时线程也可以被中断,所以看来InterruptibleChannel是一个很好的解决方案。我的问题是代码应该是什么样的?到目前为止,我似乎没有发送任何东西。这里是:
this.outstream = Channels.newChannel(outstream);
this.outstream.write(message);
其中
outstream
是我从Bluetooth套接字派生的OutputStream。 最佳答案
假设您在注释中提到的计时器线程将在一定时间后中断通道,那么有两种情况需要处理,每种情况都有其自己的已检查异常:
情况1:在您的线程被I / O操作阻塞时,另一个线程在通道上调用了close()
。您对write
的呼叫将以AsynchronousCloseException
中止。
情况2:您的线程上另一个名为interrupt()
的线程正在阻塞I / O操作。您对write()
的呼叫将以ClosedByInterruptException
中止。
您需要更新代码以处理这些异常:
this.outstream = Channels.newChannel(outstream);
try {
outstream.write(message);
}
catch(AsynchronousCloseException e) {
System.out.println("Another thread closed the stream while this one was blocking on I/O!");
}
catch(ClosedByInterruptException e) {
System.out.println("This thread has been interrupted while blocking on I/O!");
}
请注意,
InterruptibleChannel
的约定指定仅当在I / O操作中阻止了当前线程时才会抛出这些异常。如果您的线程没有阻塞,则不会抛出这些异常。在这种情况下,很可能如果另一个线程关闭了该通道,则您将获得另一个IOException来尝试写入关闭的通道,并且如果您不注意当前线程的中断状态,它将继续写入。但是,由于接口没有指定这种情况下的行为,因此实现者将自行决定要做什么。