2014-06-14 168 views
0

我想在Java中实现一个停止点,以便在20秒内完成任何操作,除非用户按Enter键。 对于我只是用了一下:单线程中断睡眠

sleep(20000); 

我知道一个线程可以“唤醒”使用wait()notify()另一个线程,但我想知道是否有东西,并不需要抛出一个新的线。理想情况下,我想能够添加超时读操作上从键盘的InputStream,这样我就可以这样做:

try { 
    //Here is where the waiting happens 
    myStream.read(); 
} catch (TimeoutException e) { } 
//... Continue normally 
+1

从Stream中读取是阻塞IO操作。 –

+0

一旦一个线程正在休眠,它只能被另一个线程唤醒 – Victor2748

回答

2

你可以,而不是睡了20多岁,而不是睡1秒时间间隔和民意调查,看看用户输入任何东西:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    for (int i = 0; i < 20; i++) { 
     try { 
      sleep(1000); 
      if (in.ready()) { 
       break; 
      } else { 
       System.out.println(i+" seeconds have passed"); 
      } 
     } catch (InterruptedException | IOException ex) { 
     } 
    } 
1

的意见是正确的,但提出一个(有点哈克)解决方法:

BufferedReader myStream = new BufferedReader(new InputStreamReader(System.in));    
long startTime = System.currentTimeMillis(); 

while(System.currentTimeMillis() < (startTime + 20000)) { 
    if (myStream.ready()) { 
     //do something when enter is pressed 
     break; 
    } 
} 
1

一种阻塞读取timeou由于从输入流中读取无限期地阻塞,所以不能使用一个线程来完成中断。有一种方法可以使用Future执行超时计算,但这首先涉及并发编程。