10

Suppose I have a code where it asks the user to give some input, something like this:

for (condition) {
System.out.println("Please give some input");
System.in.read();
} //lets say this loop repeats 3 times and i face a problem during second iteration

but I want to give the user a 60 second time limit, and then throw an exception (in this case, I think its TimeOutException). How do I do that?

d-cubed
  • 1,034
  • 5
  • 30
  • 58
hari
  • 1,297
  • 5
  • 17
  • 36
  • Duplicate: http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout – cnicutar May 02 '11 at 06:32

3 Answers3

5
import java.util.Timer;
import java.util.TimerTask;
import java.io.*;
public class test
{
    private String str = "";

    TimerTask task = new TimerTask()
    {
        public void run()
        {
            if( str.equals("") )
            {
                System.out.println( "you input nothing. exit..." );
                System.exit( 0 );
            }
        }    
    };

    public void getInput() throws Exception
    {
        Timer timer = new Timer();
        timer.schedule( task, 10*1000 );

        System.out.println( "Input a string within 10 seconds: " );
        BufferedReader in = new BufferedReader(
        new InputStreamReader( System.in ) );
        str = in.readLine();

        timer.cancel();
        System.out.println( "you have entered: "+ str ); 
    }

    public static void main( String[] args )
    {
        try
        {
            (new test()).getInput();
        }
        catch( Exception e )
        {
            System.out.println( e );
        }
        System.out.println( "main exit..." );
    }
}
PsylentKnight
  • 149
  • 14
Nirmal- thInk beYond
  • 11,847
  • 8
  • 35
  • 46
  • Is there any other simpler way?Because I don't have timer and timertask classes in my java.util package – hari May 02 '11 at 06:34
  • start thread, simply use while loop for your time and after interval use thread.destroy(); – Nirmal- thInk beYond May 02 '11 at 06:47
  • i have something to ask u..lets say i have written this - Thread t = new Thread(); t.start(); //i started a thread do {//my logic}while(condition); t.destroy(); //i destroyed the thread.but not sure why. Is my code skeleton correct? And what is the condition i have to put inside while()? Can u pls clear all of my doubts? – hari May 02 '11 at 09:42
  • in your case you dont need to use while because you want to exit if user input something, so if user not inputs something then u have to wait for specified time so so your login is right just remove while loop – Nirmal- thInk beYond May 02 '11 at 12:33
  • I guess i didn't tell u properly. I want to wait for the user to input some value. But i want to wait only for a few seconds. After that specified time i want to show an error and exit.Also now my problem is, the sysout and sysinread - both come inside a for loop. So is it not possible for me to continue with the next iteration?I have updated my code.. – hari May 03 '11 at 04:24
  • what is task statement? – MRazian May 08 '20 at 13:42
1

I use joda-time for this kind of stuff:

maven:

  <!--  Joda Time -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>1.6.2</version>
    </dependency>

When prompting to input, set a LocalDateTime variable:

 LocalDateTime timeOut = new LocalDateTime().plusSeconds(15);

And loop until user either inputs or the timeout is reached:

 if (timeOut.isBefore(new LocalDateTime())) {
 //throw your exception if this case happens
 }
miken32
  • 42,008
  • 16
  • 111
  • 154
chzbrgla
  • 5,158
  • 7
  • 39
  • 56
-4

How about something as simple as this:

    Scanner reader = new Scanner(System.in); 
    System.out.println("Enter a number: ");
    long limit = 5000L;
    long startTime = System.currentTimeMillis();
    Long l = reader.nextLong();
    if ((startTime + limit) < System.currentTimeMillis())
        System.out.println("Sorry, your answer is too late");
    else
        System.out.println("Your answer is on time");

This will not throw an exception, only inform the user about being too late with his answer. (related to another question that was referred to this post).

Felix
  • 213
  • 2
  • 9