Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重新打开和中断键盘流?_Java_Multithreading_Io_Stream - Fatal编程技术网

Java 如何重新打开和中断键盘流?

Java 如何重新打开和中断键盘流?,java,multithreading,io,stream,Java,Multithreading,Io,Stream,我有一个非常简单的问题。 基于Java I/O方案,每当线程等待某些数据时,它是否会被阻塞?这是真的吗?像这样的 byte[] _buff=new byte[1024]; int _r=_in.read(_buff);//it blocks until some data is available void run(){ _in.close(); } 放弃阅读的唯一可能的方法是用另一个线程关闭流,对吗?像这样的 byte[] _buff=new byte[1024]; int _r=_in.

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

byte[] _buff=new byte[1024];
int _r=_in.read(_buff);//it blocks until some data is available
void run(){
_in.close();
}
放弃阅读的唯一可能的方法是用另一个线程关闭流,对吗?像这样的

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.一旦溪流关闭,如何再次打开它

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

关闭默认系统输入流不是一个好主意,我建议您使用
JConsol
jNativeHook
,这些家伙不会阻塞,而是侦听事件