【问题标题】:how to reopen and interrupt keyboard stream?如何重新打开和中断键盘流?
【发布时间】:2013-11-14 05:56:39
【问题描述】:

我有一个非常简单的问题。
基于Java I/O方案,每当一个线程在等待一些数据时,它会被阻塞吗?是真的吗?像这样的。

byte[] _buff=new byte[1024];
int _r=_in.read(_buff);//it blocks until some data is available

而放弃阅读的唯一可能方法是由另一个线程关闭流,对吗?像这样的。

void run(){
_in.close();
}

所以如果我在上述情况下是正确的,那么为什么这是不可能的,只需通过关闭流来中断正在从System.in 读取的线程。我运行一个只等待 5 秒的线程,然后想要中断/放弃从流中读取的其余部分。

void _read_data(){
  System.out.print("enter y to save the workspace ");
  new Thread(_cancel_thread).start();
  int _r=System.in.read();//blocks
}
///////////
void run(){
  try{
   Thread.sleep(5000);
   System.in.close();//doesn't work.
  }catch(Exception _ex){}
}

问题:
1.如何关闭流?!为什么关闭流线程不能关闭流?!
2.流关闭后,如何再次打开?!

【问题讨论】:

    标签: java multithreading io stream


    【解决方案1】:

    对于第一个问题,我认为这是因为可能(我不知道,不确定)流有点被较低级别锁定,所以当它被锁定时,另一个线程只是在等待获取锁并关闭它。
    对于第二个,我真的不知道是否有任何类(流)可以与键盘流一起使用,但你为什么真的要关闭它?只需将流保存在某处(例如in=System.in),然后通过调用System.setIn(newStream) 将标准流重定向到另一个流,然后每当您想返回键盘流时,使用引用重置流。

    关闭默认系统输入流不是个好主意,我建议你使用JConsoljNativeHook,这些家伙不会阻塞,而是监听事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多