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:

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..." );
     }
}
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.
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