MTANG
MTANG

Reputation: 516

Java timeout function is not working for my below codes

I tried to set a 1-second time limit for my SQL query in Java, using the methods: How to timeout a thread

public class App {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(1, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        try {
            // some codes to do query via SQL Server JDBC, assuming it takes 10 seconds.
            ResultSet result = statement.executeQuery();
            // some codes to print the query result
        return "Done";
        }
        catch (Exception e) {
            System.out.println();
            e.printStackTrace();
        }
    }
}

However, I found that though it prints 'Terminated' after 1 second, the program keeps running and prints the query result after 10 seconds. What's the reason why it doesn't work and how to fix it?

Upvotes: 0

Views: 718

Answers (3)

ShaheerL
ShaheerL

Reputation: 61

Another way you can approach this is by using the thread.sleep() method. I often use it when I want my program to simply pause for a short or long period of time. In the parameters, you put values in thousands that correspond to seconds. For example:

public static void main(String[] args) throws InterruptedException // Required for thread.sleep()
{
    System.out.println("Hi there.");
    Thread.sleep(2000); // Wait two seconds before running the next line of code
    System.out.println("Goodbye.");
}

This is quite basic, but can be used for more than just strings. Hope this helps.

Upvotes: -1

Joe C
Joe C

Reputation: 15714

Calling cancel on a future does not guarantee that the job will be cancelled. It depends on the method checking periodically for interrupts, and then aborting if an interrupt is detected. Statement.execute() does not do that.

In your case, given you are executing a SQL statement, there is a method in the Statement class (setQueryTimeout) which achieves what you appear to be after without over-engineering timeouts by other means.

Upvotes: 3

JackPGreen
JackPGreen

Reputation: 1139

shutdownNow doesn't actually stop a thread, it merely sends a signal (an interrupt) that the Thread can act upon. Stopping a Thread in Java is tricky because while you can just kil the thread (with Thread.stop), you really shouldn't because you have no idea what state the Thread is in and what it will leave behind.

You can find more information in the documentation.

Upvotes: 3

Related Questions