1

是否可以制作InputStream与 base 相同的an InputStream,除了当基本流被阻塞时,可以通过调用方法将字节插入流中?草图:

public class HackInputStream extends InputStream {
    public HackInputStream (InputStream base) { /* stuff */ }
    public int read() throws IOException { /* stuff */ }
    public void insertByte(byte b) { /* stuff */ }
}

我只会在基本流被绝对阻塞时插入字节,所以竞争条件不应该成为问题。我尝试使用一个线程来实现这个类,该线程贪婪地将字节从基本流读取到LinkedBlockingQueue. insertByte将字节直接插入队列,并read简单地从队列中读取字节,当队列为空时阻塞。

这几乎奏效了......但是当我Scanner使用 using时new Scanner(new HackInputStream(System.in),该nextLine方法不起作用。不幸的是,我首先想要这个奇怪的类的原因是为了解锁一个被阻止的Scanner

(这是我要解决的问题,以防有人有更好的解决方案:

我的程序是一个“shell”,它在给定命令时启动任务(线程)。其中一些任务会自行终止,而有些则不会。我想在任务终止时立即返回到命令提示符,但如果任务永远不会终止,我想通过输入换行符来终止它。

目前,主线程等待任务终止,而看门狗线程等待换行符,如果接收到则终止任务。现在,如果任务自行终止,我无法在不手动输入换行符的情况下输入命令。看门狗线程被不间断地阻塞,无论如何它都会消耗下一行输入,可能导致下一个命令未读。我正在尝试进行更改System.in,以便可以以编程方式为其提供换行符。)

4

1 回答 1

0

更新:我以一种更简单的方式解决了我的问题,仅Scanner.nextLine()在任务仍在运行时调用。

于 2013-01-22T19:26:44.703 回答