[Java] Exécuter un processus spécifique dans un autre thread avec Executor Service [Eviter une boucle infinie]

introduction

Il s'agit d'un exemple qui exécute un processus spécifique en Java dans un thread séparé. Lorsqu'une boucle infinie se produit dans un certain processus (lorsque le processus n'est pas terminé dans le délai spécifié), il est nécessaire d'interrompre le processus et de générer une erreur, il s'agit donc d'un mémorandum à ce moment-là.

échantillon

main.java



package main;


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
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 Main {
	
	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		int c = 3;
		
		ExecutorService exec = Executors.newSingleThreadExecutor();
		//Exécuter le traitement dans un autre thread
		Future<Integer> future = exec.submit(new ExcutorSample(a, b, c));
		Integer result = 0;
		try{
			//Attendez 10 secondes. Si le processus se termine correctement, le résultat du calcul sera renvoyé. Lancer une exception après 10 secondes
			result = future.get(10, TimeUnit.SECONDS);
		} catch(TimeoutException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		} finally {
			//Suspendre le traitement. Ce processus est inoffensif même si le processus est terminé normalement.
			future.cancel(true);
		}
        
		System.out.println(result);
		  
	}

	public static class ExcutorSample implements Callable<Integer>{
		private int a;
		private int b;
		private int c;

		public ExcutorSample(int a, int b, int c){
			this.a = a;
			this.b = b;
			this.c = c;
		}
	    
		@Override
		public Integer call() throws Exception {
			//Traitement en boucle infinie intégré
			boolean loopFlg = true;
			while(loopFlg) {
				Thread.sleep(1000);
				System.out.println("En boucle");
			}
			return a + b + c;
		}
	}
}

Résultat d'exécution

En boucle
En boucle
En boucle
En boucle
En boucle
En boucle
En boucle
En boucle
En boucle
En boucle
java.util.concurrent.TimeoutException
	at java.util.concurrent.FutureTask.get(FutureTask.java:205)
	at main.Main.main(Main.java:24)
0

en conclusion

Ne générez pas de boucle infinie

Recommended Posts

[Java] Exécuter un processus spécifique dans un autre thread avec Executor Service [Eviter une boucle infinie]
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
processus thread-safe en java
Diviser une chaîne avec ". (Dot)" en Java
Lire une chaîne dans un fichier PDF avec Java
Créer un CSR avec des informations étendues en Java
Créons un processus chronométré avec la minuterie de Java! !!
Implémentez rapidement singleton avec enum en Java
Sortie true avec if (a == 1 && a == 2 && a == 3) en Java (identifiant invisible)
Utilisez java1.7 (zulu7) dans un répertoire spécifique avec jenv
Je suis comme écrire un processus qui ne cesse de s’augmenter (liste) dans une boucle de liste en Java (au travail) »