实施可中断的方法

时间:2012-12-03 21:34:38

标签: java multithreading

我想实现一个阻塞输入的方法,但可以是Thread.interrupt()'ed。例如,它在System.in.read()上阻塞,然后另一个线程可以中断它,从而突破阻塞读取,并出现InterruptedException。

有什么建议吗? 感谢

3 个答案:

答案 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并且不捕获原始异常。或者你在寻找别的东西?