Comment résoudre l'exception de délai d'attente d'interruption du thread Java (ThreadInterruptedTimeoutException)
Dans la programmation multi-thread Java, nous rencontrons souvent des situations où le temps d'exécution du thread est trop long. Afin d'éviter que les threads n'occupent trop de ressources système, nous définissons généralement un délai d'attente. Lorsque le temps d'exécution du thread dépasse le délai d'attente, nous espérons pouvoir interrompre l'exécution du thread.
Java fournit un mécanisme d'interruption de thread. En appelant la méthode interruption() du thread, vous pouvez envoyer un signal d'interruption au thread. Lorsque nous appelons la méthode interruption() du thread, nous n'interrompons pas immédiatement l'exécution du thread, mais émettons une demande d'interruption au thread et définissons le bit d'indicateur d'interruption du thread sur true. Pendant l'exécution, un thread peut déterminer s'il a été interrompu en vérifiant son propre bit d'indicateur d'interruption et terminer son exécution si nécessaire.
En programmation multi-thread, on souhaite parfois pouvoir attendre le résultat d'une opération dans un délai d'attente et interrompre l'exécution du thread lorsque le délai d'attente arrive. Un exemple courant est la gestion des délais d’attente des requêtes réseau. Nous pouvons résoudre ce problème des manières suivantes.
Tout d'abord, nous devons créer une classe de thread pour effectuer les opérations que nous devons attendre. Dans cette classe de thread, nous devons utiliser la méthode sleep() du thread pour simuler l'opération que nous devons attendre.
public class MyThread implements Runnable { @Override public void run() { try { // 模拟需要等待的操作 Thread.sleep(5000); } catch (InterruptedException e) { // 线程被中断,做一些清理工作 System.out.println("线程被中断"); } } }
Ensuite, nous créons un fil de discussion principal pour démarrer notre fil de discussion et définir un délai d'attente.
public class Main { public static void main(String[] args) { MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); // 设置超时时间 int timeout = 3000; // 启动线程 thread.start(); try { // 等待线程执行完毕或超时 thread.join(timeout); // 如果线程未执行完毕,则中断线程 if (thread.isAlive()) { thread.interrupt(); } } catch (InterruptedException e) { e.printStackTrace(); } } }
Dans le code ci-dessus, nous utilisons la méthode join() de la classe Thread pour attendre que le thread termine son exécution ou expire. Si le thread termine son exécution, la méthode join() retournera immédiatement ; si le délai d'attente est dépassé et que la méthode join() n'a pas renvoyé, nous pouvons penser que l'exécution du thread a expiré et interrompre l'exécution du thread en appelant le thread. méthode interruption().
Dans le code ci-dessus, nous utilisons la méthode sleep() dans la méthode run() du thread pour simuler l'opération d'attente et définissons un temps d'attente plus grand (5 000 millisecondes). Dans le thread principal, nous définissons un court délai d'attente (3 000 millisecondes). De cette façon, lorsque l’exécution du thread dépasse 3 secondes, nous interromprons l’exécution du thread.
Grâce au code ci-dessus, nous pouvons résoudre le problème du délai d'interruption des threads dans la programmation multithread Java. Nous pouvons définir différents délais d'attente en fonction de besoins spécifiques et utiliser cette méthode pour gérer les délais d'attente d'exécution des threads. Dans le même temps, nous devons également gérer correctement les interruptions de thread dans la méthode run() du thread et effectuer un travail de nettoyage pour garantir le bon fonctionnement du programme.
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!