Pour établir une limite de temps pour un thread, envisagez d'utiliser ExecutorService plutôt que Timer. ExecutorService offre une solution flexible pour contrôler l'exécution d'un thread dans une durée spécifiée.
Voici un extrait de code affiné utilisant 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!"; } } }
En tirant parti de Future#get(), vous pouvez établir un délai d'attente pour la tâche. Si la tâche se termine dans ce délai, le résultat est récupéré comme prévu. Cependant, s'il ne parvient pas à se terminer dans le temps imparti, le bloc catch est exécuté, vous permettant d'annuler la tâche.
Clarification sur l'utilisation de sleep()
L'inclusion de sleep() dans l'exemple fourni est uniquement à des fins de démonstration. Il est destiné à simuler une tâche de longue durée au sein du SSCCE. Dans votre scénario actuel, remplacez sleep() par la tâche de longue durée souhaitée.
Pour éviter les blocages potentiels, il est crucial de vérifier périodiquement dans la tâche de longue durée si votre thread a été interrompu, comme indiqué dans le extrait de code suivant :
while (!Thread.interrupted()) { // Perform your long-running task here. }
Cette approche méthodique garantira que votre fil répond rapidement aux demandes d'interruption et se termine correctement après l'expiration du délai.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!