我正在尝试在 Android 中实现一个使用蓝牙通信的线程。我希望线程即使在 I/O 阻塞时也是可中断的,所以InterruptibleChannel似乎是一个很好的解决方案。我的问题是代码应该是什么样子?到目前为止,我似乎没有发送任何东西。这里是:
this.outstream = Channels.newChannel(outstream);
this.outstream.write(message);
outstream
我从蓝牙套接字派生的 OutputStream在哪里。
我正在尝试在 Android 中实现一个使用蓝牙通信的线程。我希望线程即使在 I/O 阻塞时也是可中断的,所以InterruptibleChannel似乎是一个很好的解决方案。我的问题是代码应该是什么样子?到目前为止,我似乎没有发送任何东西。这里是:
this.outstream = Channels.newChannel(outstream);
this.outstream.write(message);
outstream
我从蓝牙套接字派生的 OutputStream在哪里。
假设您在评论中提到的计时器线程将在一定时间后中断通道,那么您需要处理两种情况,每种情况都有自己的已检查异常:
close()
情况 1:当您的线程在 I/O 操作上被阻塞时,在通道上调用了另一个线程。您的呼叫write
将中止,并带有AsynchronousCloseException
.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!");
}
请注意,合同规定只有当当前线程在 I/O 操作中被阻塞时InterruptibleChannel
才会抛出这些异常。如果你的线程没有阻塞,那么这些异常都不会被抛出。在这种情况下,如果另一个线程关闭了通道,您可能会因为尝试写入已关闭的通道而获得不同的 IOException,并且如果您不注意当前线程的中断状态,它会继续写入。但是,由于接口未指定该情况的行为,因此由实现者决定要做什么。