我正在尝试在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来尝试写入关闭的通道,并且如果您不注意当前线程的中断状态,它将继续写入。但是,由于接口没有指定这种情况下的行为,因此实现者将自行决定要做什么。

07-25 23:58