To establish a time limit for a thread, consider using ExecutorService rather than Timer. ExecutorService offers a flexible solution for controlling a thread's execution within a specified duration.
Here's a refined code snippet using ExecutorService:
import java.util.concurrent.*; public class ThreadTimeout { 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(3, TimeUnit.SECONDS)); System.out.println("Finished!"); } catch (TimeoutException e) { future.cancel(true); System.out.println("Terminated!"); } executor.shutdownNow(); } static class Task implements Callable<String> { @Override public String call() throws Exception { // Your long-running task should go here. return "Ready!"; } } }
By leveraging Future#get(), you can establish a timeout for the task. If the task finishes within that time, the result is retrieved as expected. However, if it fails to complete within the allotted time, the catch block is executed, allowing you to cancel the task.
Clarification on the sleep() Usage
The inclusion of sleep() in the provided example is solely for demonstration purposes. It's intended to simulate a long-running task within the SSCCE. In your actual scenario, replace sleep() with your desired long-running task.
To avoid potential deadlocks, it's crucial to periodically check within the long-running task whether your thread has been interrupted, as seen in the following code snippet:
while (!Thread.interrupted()) { // Perform your long-running task here. }
This methodical approach will ensure that your thread responds promptly to interruption requests and gracefully terminates upon timeout.
The above is the detailed content of How to Precisely Timeout a Thread in Java?. For more information, please follow other related articles on the PHP Chinese website!