我如何使用InterruptibleChannel?

时间:2012-04-10 11:31:58

标签: java

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

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

其中outstream是我从蓝牙套接字派生的OutputStream。

1 个答案:

答案 0 :(得分:2)

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

  • 案例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,如果你没有注意当前线程的中断状态,它将继续写入。但是,由于接口未指定该情况的行为,因此由实现者决定要执行的操作。