0

我正在尝试在 Android 中实现一个使用蓝牙通信的线程。我希望线程即使在 I/O 阻塞时也是可中断的,所以InterruptibleChannel似乎是一个很好的解决方案。我的问题是代码应该是什么样子?到目前为止,我似乎没有发送任何东西。这里是:

this.outstream = Channels.newChannel(outstream);
this.outstream.write(message); 

outstream我从蓝牙套接字派生的 OutputStream在哪里。

4

1 回答 1

2

假设您在评论中提到的计时器线程将在一定时间后中断通道,那么您需要处理两种情况,每种情况都有自己的已检查异常:

  • close()情况 1:当您的线程在 I/O 操作上被阻塞时,在通道上调用了另一个线程。您的呼叫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!");
}

请注意,合同规定只有当当前线程在 I/O 操作中被阻塞时InterruptibleChannel才会抛出这些异常。如果你的线程没有阻塞,那么这些异常都不会被抛出。在这种情况下,如果另一个线程关闭了通道,您可能会因为尝试写入已关闭的通道而获得不同的 IOException,并且如果您不注意当前线程的中断状态,它会继续写入。但是,由于接口未指定该情况的行为,因此由实现者决定要做什么。

于 2012-04-11T11:51:07.383 回答