Java 如何使用中断频道?

Java 如何使用中断频道?,java,Java,我正在尝试在Android中实现一个使用蓝牙通信的线程。我希望线程即使在阻塞I/O时也是可中断的,所以这似乎是一个很好的解决方案。我的问题是代码应该是什么样子?到目前为止,我所拥有的似乎没有发送任何东西。这是: this.outstream = Channels.newChannel(outstream); this.outstream.write(message); 其中,outstream是我从蓝牙套接字导出的输出流。假设您的评论中提到的计时器线程将在一定时间后中断通道,则需要处理两种情

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

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

其中,
outstream
是我从蓝牙套接字导出的输出流。

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

  • 案例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!");
}

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

我不理解您的问题。您希望中断从何处开始?如果/当中断发生时,您希望发生什么?我的动机是希望
outstream
instream
在一段时间后超时。因为没有机制可以实现这一点,所以我正在生成一个线程,该线程从主线程接收
outstream
instream
。然后,如果该线程挂起读或写,主线程将中断它,导致流停止它们正在做的任何事情。