Maison >Java >javaDidacticiel >Comment ExecutorService peut-il améliorer la gestion du délai d'expiration des threads sur TimerTask ?
Délai d'expiration des threads : approches alternatives
Bien que TimerTask puisse gérer les délais d'attente au sein des threads, ce n'est pas la solution la plus optimale. Envisagez plutôt d'utiliser ExecutorService, car il fournit une approche complète pour la gestion des threads et les délais d'attente.
ExecutorService vous permet de créer une tâche appelable et de la soumettre pour exécution. Une fois soumise, la tâche peut être surveillée via un objet Future. En spécifiant un délai d'attente dans la méthode Future#get(), vous pouvez contrôler la durée pendant laquelle le thread doit s'exécuter avant qu'une exception ne soit levée.
Voici un exemple d'implémentation :
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class Test { 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(); } } class Task implements Callable<String> { @Override public String call() throws Exception { // Replace this with your long-running task. Thread.sleep(4000); return "Ready!"; } }
Dans ce Dans ce scénario, la tâche s'exécute pendant 4 secondes avant de se terminer. Si le délai d'attente est augmenté à 5 secondes, la tâche se terminera sans être terminée. Si le délai d'attente est défini sur une durée plus courte, une TimeoutException sera levée et la tâche sera annulée.
Pour vérifier les interruptions de thread dans la tâche de longue durée, utilisez while (!Thread.interrupted() ) { ... } boucle. Ce faisant, la tâche peut se terminer gracieusement lorsque cela est nécessaire.
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!