Le code suivant essaie de l'accompagner.Fermeture progressive des threads et de l'exécuteur
Le code boucle pour toujours et vérifie s'il y a des demandes en attente à traiter. S'il y en a, il crée un nouveau thread pour traiter la requête et la soumet à l'exécuteur. Une fois tous les threads terminés, il dort pendant 60 secondes et vérifie à nouveau les demandes en attente.
public static void main(String a[]){
//variables init code omitted
ExecutorService service = Executors.newFixedThreadPool(15);
ExecutorCompletionService<Long> comp = new ExecutorCompletionService<Long>(service);
while(true){
List<AppRequest> pending = service.findPendingRequests();
int noPending = pending.size();
if (noPending > 0) {
for (AppRequest req : pending) {
Callable<Long> worker = new RequestThread(something, req);
comp.submit(worker);
}
}
for (int i = 0; i < noPending; i++) {
try {
Future<Long> f = comp.take();
long name;
try {
name = f.get();
LOGGER.debug(name + " got completed");
} catch (ExecutionException e) {
LOGGER.error(e.toString());
}
} catch (InterruptedException e) {
LOGGER.error(e.toString());
}
}
TimeUnit.SECONDS.sleep(60);
}
}
Ma question est la plupart du traitement effectué par ces threads traitent avec la base de données. Et ce programme fonctionnera sur une machine Windows. Qu'arrive-t-il à ces threads lorsque quelqu'un tente d'arrêter ou de déconnecter la machine? Comment fermer gracieusement les threads en cours d'exécution et aussi l'exécuteur?
Ceci est en arrière. En supposant que 'ExecutorService' est l'une des valeurs typiques renvoyées par les méthodes d'usine' Executors', les threads de backing sont des threads non-daemon. Le hook de fermeture ne sera pas appelé jusqu'à ce que ces threads se terminent, et cela ne se produira pas tant que 'ExecutorService' ne sera pas arrêté. Votre solution ne fonctionnera que si les threads de l'exécuteur sont non démon ou si votre programme reçoit une interruption de l'utilisateur. –
L'OP demande spécifiquement si la JVM a été appelée à effectuer une fermeture ordonnée. Quoi qu'il en soit, le contenu de la réponse est précis, il suffit de ne pas le faire dans un hook de fermeture pour terminer le service de l'exécuteur plus tôt. –
Merci d'avoir répondu si rapidement.Je suppose que j'ai raté cette partie de leur question. Pouvez-vous ajouter un troisième '***' pour clarifier ce bit? –