我有一个非常简单的问题 基于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.一旦流关闭,如何再打开它?!
答案 0 :(得分:2)
对于第一个问题,我认为这是因为可能(我不知道,不确定)流是由较低级别锁定的,所以当它被锁定时,另一个线程只是等待获取锁并关闭它。
而对于第二个,我真的不知道是否有任何类(流)可以使用键盘流,但为什么你真的要关闭它?只需将流保存在某处(如in=System.in
),然后通过调用System.setIn(newStream)
将标准流重定向到另一个流,然后每当您想要返回键盘流时,请使用引用重置流。
关闭默认系统输入流并不是一个好主意,我建议您使用JConsol
或jNativeHook
,这些人不会阻止,而是会监听事件。