2012-04-07 27 views
6

È possibile impostare il timer per l'input dell'utente? Attendere 10 secondi - fare esercizio successivo e così via mi riferisco per esempiotimeout impostato per l'input dell'utente

//wait several seconds{ 
String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
//wait server seconds} 
//next operation and etc. 

risposta

4

Non a destra, fuori dalla scatola, no. Normalmente il Reader esce da una chiamata read() solo quando un altro thread chiude il flusso sottostante o raggiunge la fine dell'input.

Poiché read() non è tutto ciò che può essere interrotto, questo diventa un problema di programmazione simultanea. Il thread che conosce il timeout dovrà essere in grado di interrompere il thread che sta cercando di leggere l'input.

In sostanza, il thread di lettura dovrà eseguire il polling del metodo ready() del Reader, anziché bloccarsi in read() quando non c'è nulla da leggere. Se si esegue il wrapping di questa operazione di polling e di attesa in un java.util.concurrent.Future, si chiama il metodo get() di Future con un timeout.

Questo articolo va in qualche dettaglio: http://www.javaspecialists.eu/archive/Issue153.html

12

Un modo un po 'più facile da fare questo che la risposta di Benjamin Cox sarebbe quello di fare qualcosa di simile

int x = 2; // wait 2 seconds at most 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
long startTime = System.currentTimeMillis(); 
while ((System.currentTimeMillis() - startTime) < x * 1000 
     && !in.ready()) { 
} 

if (in.ready()) { 
    System.out.println("You entered: " + in.readLine()); 
} else { 
    System.out.println("You did not enter data"); 
} 

Questa volontà, tuttavia consumare più risorse di quante la sua soluzione .

+2

BufferedReader.ready() sembra restituire true se sono disponibili byte, non necessariamente includendo una nuova riga. Considera il caso in cui vi è un personaggio in attesa senza una nuova riga finale. in.ready() restituisce true, viene chiamato in.readLine(), ma blocca indefinitamente l'attesa di una nuova riga. – pendor

+1

@pendor Ma lo standard 'System.in' fornirà solo i dati se l'utente preme Invio sulla riga di comando che fornisce la sequenza di nuova riga. – Jeffrey

+1

@Jeffrey è documentato ovunque? – Max

Problemi correlati