Ad un certo punto in un mio programma devo gestire un timeout sull'input dell'utente.
Se l'utenteinserisce una stringa entro 5 secondi, stampo la stringa, altrimenti sollevo un'eccezione da me creata.
Ho creato una classe Timeout con tanto di main di prova in fondo in questa maniera:
In poche parole il main esegue il metodo getInput() che, oltre al thread d'esecuzione principale che va a chiedere all'utente di inserire input e rimanere in attesa di tale input, avvia dopo tot secondi(grazie al timer) un secondo thread d'esecuzione, che va a eseguire il corpo del metodo run del task.codice:package Utilities; import java.io.*; import java.util.Timer; import java.util.TimerTask; import Exceptions.TimeoutException; public class Timeout { private String str = ""; private boolean timeout = false; private BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); TimerTask task = new TimerTask() { public void run() { if( str.equals("") ) { System.out.println( "TimeOut!!! " ); timeout = true; ------> ????? <----- } } }; public String getInput(String mex, int time) throws TimeoutException, IOException { Timer timer = new Timer(); timer.schedule( task, time*1000 ); System.out.println( mex ); str = in.readLine(); if (timeout) throw new TimeoutException(); else { timer.cancel(); System.out.println( "hai inserito "+str ); } return str; } public static void main( String[] args ) { try{ (new Timeout()).getInput("Inserisci: ", 5); } catch( Exception e ){ System.out.println( e ); } System.out.println( "main exit..." ); } }
Fin qui tutto OK.
Vi sono quindi due casi:
1) utente inserisce input entro tot secondi: il thread principale scorre e entra nel ramo else e termina; dopo tot sec è stato avviato il thread secondario (metodo run()), ha controllato che str non è vuota e il thread è terminato anch'esso.
2) utente non inserisce input entro tot sec: il thread principale arriva fino allla richiesta di input dall'utente, dopo tot secondi viene avviato il thread secondario che vede che str è ancora vuota e setta la variabile globale timeout a true (in modo tale da poter entrare nel ramo if dopo e poter sollevare la mia eccezione).
IL PROBLEMA che chiedo a voi è appunto nel secondo caso, dove il thread secondario viene eseguito e terminato correttamente, ma il thread principale continua a rimanere fermo in attesa di input.(infatti se poi inserisco qualcosa da tastiera, entra nell'if e solleva l'eccezione).
la mia idea è che devo inserire una linea di codice dove ho indicato ----> ??? <-----, un qualcosa che posso bloccare o terminare la richiesta di input. Ho già provato con close() di BufferedReader ma non va.
Sapete consigliarmi ???
Grazie

Rispondi quotando