Java ExecutorService mettre en pause/reprendre un thread spécifique
Est-il un moyen d'utiliser ExecutorService pour mettre en pause/reprendre un thread spécifique?
private static ExecutorService threadpool = Executors.newFixedThreadPool(5);
Imaginer que je veux arrêter le fil dont l'id=0 (en supposant que chacun se voit attribuer un id incrémentielle jusqu'à ce que la taille du pool de threads est atteint).
Après un certain temps, en appuyant sur un bouton, disons, je veux la reprendre thread spécifique et de laisser tous les autres threads avec leur statut actuel, qui peut être mis en pause ou reprise.
J'ai trouvé sur la documentation de Java une version inachevée de PausableThreadPoolExecutor. Mais il ne convient pas à ce dont j'ai besoin, car il reprendre tous les threads du pool.
Si il n'y a aucun moyen de le faire avec l'implémentation par défaut de la ExecutorService quelqu'un peut me pointer à une implémentation de Java pour ce problème?
Merci!
- Êtes-vous sûr? Fil avec id donné exécute certains choisie au hasard de travail, de sorte que vous êtes à l'arrêt de certaines inconnues de l'emploi. Quel est le sens de le faire?
- Imaginez la situation suivante: Vous avez un gestionnaire de téléchargement, et que gestionnaire, vous pouvez arrêter et reprendre les téléchargements. Pour chacun, vous êtes à télécharger les choses, n'a pas d'importance ce ne sont pas pertinentes, et que vous voulez arrêter de télécharger reprendre là où vous le voulez. Cela rend la question plus clair pour vous?
- Plus clair, mais toujours pas beaucoup de sens. Arrêter/reprendre des téléchargements est sur une logique d'entreprise, tandis que le pool de threads est sur des ressources de calcul. À la logique de contrôle par ajout/suppression de ressources est une mauvaise idée à mon humble avis.
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la mauvaise voie. Le pool de threads possède les fils et en les partageant avec votre code pourrait gâcher les choses.
Vous devriez vous concentrer sur de faire vos tâches (passé à l'threads annulable/interruptable) et de ne pas interagir avec les threads appartenant à la piscine directement.
En outre, vous ne pouvez savoir à quel type de travail est en train d'être exécutée à la fois que vous essayez d'interrompre le thread, donc je ne vois pas pourquoi vous seriez intéressé à faire cette
Mise à jour:
La bonne façon d'annuler votre tâche présentée dans le pool de threads est par l'intermédiaire de la
Future
pour la tâche retourné par l'exécuteur testamentaire.1)de Cette façon, vous savez certainement que la tâche vous réellement but est tenté d'être annulée
2)Si vos tâches sont déjà conçus pour être annulable, alors votre êtes à la moitié du chemin
3) Ne pas utiliser un indicateur pour indiquer une annulation, mais l'utilisation
Thread.currentThread().interrupt()
au lieuMise à jour:
InterruptableTask
et puisqu'elles ne sont pas partagées, lalock
est privé pour chaque threado
agissant comme unlock
n'est pas partagé entre les threadssuspended
et puis essayez d'arrêter l'application, la JVM ne sera pas de l'arrêt sice, le thread est bloqué danswait
.Vous devez faire les fils deamons, ou de mettre en œuvre ce que vous avez vraiment besoin attentivementwait
à l'intérieur d'unwhile
boucle pour éviter des réveils docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait()threadPool.shutdownNow();
tous les threads qui sont danswait()
sera interrompu. Alors pourquoi ne pas la JVM arrête l'exécution de l'appel deshutdownNow()
?shutdownNow
annule tout (de retour d'une listes de toutes les tâches non commencé) et s'arrête brusquementSuggestion: de la Même manière à/au lieu des indicateurs que vous utilisez, de créer un sémaphore avec 1 de permis (
new Semaphore(1)
) pour chaque tâche, vous avez besoin pour mettre en pause/reprendre. Au début de la tâche de travail du cycle de mettre un code comme ceci:Cela provoque la tâche d'acquérir un sémaphore de permis et de les libérer immédiatement et sans elle. Maintenant, si vous souhaitez interrompre le fil (un bouton est enfoncé, par exemple), appel
semaphore.acquire()
partir d'un autre thread. Depuis le sémaphore a 0 permis de maintenant, votre thread de travail sera en pause au début du cycle suivant et attendre jusqu'à ce que vous appelezsemaphore.release()
de l'autre thread.(Le
acquire()
méthode renvoieInterruptedException
, si votre thread de travail est interrompu pendant l'attente. Il existe une autre méthodeacquireUninterruptibly()
, qui tente également d'obtenir un permis, mais ne doit pas être interrompue.)