相关疑难解决方法(0)

中断BufferedReader#readLine()而不关闭InputStream

InputStream我的Process应该安装和拆卸每当用户希望看到这一点.附着工作正常,但分离失败.中断该readLine()方法的默认答案始终是关闭流,但我不能在这种情况下或Process将完成或至少不可用于将来的附件.这是流的读取方式:

BufferedReader reader = new BufferedReader(new InputStreamReader(getProcess().getInputStream()));
String line;

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
Run Code Online (Sandbox Code Playgroud)

为了分离,我尝试了一些东西:

  • 关闭任何流,失败:close方法阻塞并等待readLine()
  • 实现另一个流来发送null/abortion值SequenceInputStream,失败:当一个人InputStream在等待输入时,另一个甚至没有被调用
  • 使用反射解锁read()任何流内的方法,失败:不确定原因,但没有工作.我们应该继续这个尝试吗?这是源代码:

    try {
    
        Field modifiers = Field.class.getDeclaredField("modifiers");
        modifiers.setAccessible(true);
    
        Field fdecoder = stream.getClass().getDeclaredField("sd");
        fdecoder.setAccessible(true);
        modifiers.setInt(fdecoder, 1);
        StreamDecoder decoder = (StreamDecoder) fdecoder.get(stream);
    
        Field flock = decoder.getClass().getSuperclass().getDeclaredField("lock");
        flock.setAccessible(true);
        modifiers.setInt(flock, 1);
        Object lock = (Object) flock.get(decoder);
    
        synchronized (lock) {
            lock.notifyAll();
        }
    
    } catch (NoSuchFieldException | IllegalAccessException e) …
    Run Code Online (Sandbox Code Playgroud)

java process stream

10
推荐指数
1
解决办法
467
查看次数

有没有使用java.nio.*来中断InputStream #read()而不关闭套接字?

您是否知道在InputStream不关闭相关套接字的情况下中断Java读取的方法?

以下是抓取套接字输入流并转换为可中断DataInputStream的当前构造策略:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Run Code Online (Sandbox Code Playgroud)

这使用了一个ReadableByteChannel提供read(ByteBuffer)支持ClosedByInterruptExceptionthrowable的方法.

问题是,调用线程使一个中断read()的电话DataInputStream的原因底层套接字被关闭.

对于我的上下文,我需要套接字保持打开状态; 该read调用正在等待未来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回.

如果有人能够建议使用JDK内置类来实现这一目标,或者可能指出某些信息无法实现,我将非常感激.

我知道还有其他方法可以达到同样的效果,但我很想知道这种方法是否可行.

java sockets nio interrupt

9
推荐指数
1
解决办法
2072
查看次数

如何停止BufferedReader readline()?

我是java新手,我试图制作客户端 - 服务器形式.客户端和服务器可以相互聊天.所以我的客户端有2个线程用于2个任务:发送和接收消息.我想当我的SendThread从键盘字符串"Bye"读取时,我的客户端将停止2个线程.但问题是线程接收仍然执行BufferedReader的语句readline()所以它无法到达出口这里是我的代码:

        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (!stop) {
                String temp = br.readLine();
                if (temp.length() == 0) {
                    Thread.sleep(100);
                }
                else System.out.println(" Receiving from server: " + temp);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
Run Code Online (Sandbox Code Playgroud)

更新:对不起大家,因为我没有更清楚地解释.我的客户端有2个独立运行的线程.因此,此代码所在的ReceiveThread可以始终等待来自服务器的消息.SendThread也总是从键盘读取数据.因此,当我输入"Bye"时,SendThread会读取此字符串并停止客户端.问题是ReceiveThread正在执行,readLine()所以它无法自行停止.

java multithreading

3
推荐指数
1
解决办法
6688
查看次数

标签 统计

java ×3

interrupt ×1

multithreading ×1

nio ×1

process ×1

sockets ×1

stream ×1