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
fonte
2012-04-07 23:20:01
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
@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
@Jeffrey è documentato ovunque? – Max