我想实现一个阻塞输入的方法,但可以是Thread.interrupt()'ed。例如,它在System.in.read()上阻塞,然后另一个线程可以中断它,从而突破阻塞读取,并出现InterruptedException。
有什么建议吗? 感谢
答案 0 :(得分:1)
首先想到的是BlockingQueue
。一个线程将挂起尝试从该队列获取smth,而另一个线程将使用元素填充该队列,例如执行从System.in
读取的线程使用元素填充BlockingQueue
。所以另一个线程可以被中断。
答案 1 :(得分:1)
考虑java.nio.InterruptibleChannel
If a thread is blocked in an I/O operation on an interruptible channel then another thread may invoke the blocked thread's interrupt method. This will cause the channel to be closed, the blocked thread to receive a ClosedByInterruptException, and the blocked thread's interrupt status to be set.
以下是如何“中断”从文件中读取数据
FileChannel ch = new FileInputStream("test.txt").getChannel();
ByteBuffer buf = ByteBuffer.allocate(1024);
int n = ch.read(buf);
当被另一个线程“read”中断时会抛出ClosedByInterruptException,它是IOException的一个实例。
以下是如何从TCP服务器“中断”读取字节
SocketChannel ch = SocketChannel.open();
ch.connect(new InetSocketAddress("host", 80));
ByteBuffer buf = ByteBuffer.allocate(1024);
int n = ch.read(buf);
答案 2 :(得分:0)
如果它已经在等待另一个阻塞方法,只需将您的方法声明为抛出InterruptedException并且不捕获原始异常。或者你在寻找别的东西?