java.util.de façon concomitante.L'avenir.get() ne retourne pas
J'ai le code Java suivant:
final Future future = exeService.submit(
new Runnable() {
public void run() {
myObject.doSomething();
}
}
);
future.get();
où exeService
est une instance de
java.util.concurrent.ExecutorService
Le problème est que myObject.doSomething()
ne revient jamais, et, par conséquent, future.get()
ne retourne jamais.
Cependant, si je remplace l'appel à submit
avec un appel à execute
comme ceci:
exeService.execute(
new Runnable() {
public void run() {
myObject.doSomething();
}
}
);
l'appel à myObject.doSomething()
ne retour. Je ne sais pas si ça compte, mais doSomething()
est un void
méthode.
Pourquoi est doSomething()
de finition lors de l'utilisation de execute
mais pas lors de l'utilisation de submit
?
Aussi, je n'ai pas besoin d'utiliser Future.get()
; qui semblait être le moyen le plus naturel de le faire. (J'ai également le même problème avec CountdownLatch
.) Le point est que j'ai besoin d'attendre pour doSomething()
avant la fin de la procédure, et, pour se complique raisons que je n'évoquerai pas ici, j'ai besoin de le lancer sur un thread séparé. Si il y a une autre façon de faire ce qui fonctionne, ce serait bien.
doSomething
, mais ne nous disent pas à ce sujet. Nous ne pouvons pas vous aider ici ...Votre question est assez déroutant. La première construction devrait fonctionner. La confusion est dans "le retour". Ne pas simplement dire "finition" ou "exécution"? Votre confusion semble être fondée sur le fait que
future.get()
en fait attend pour l'exécutable d'être terminé, et donc ne bloque le thread et de l'empêcher d'exécuter le reste du code, après le future.get()
ligne.Comment êtes-vous la création de "exeService' ? Est-il un ThreadPoolExecutor ou autre chose ?
OriginalL'auteur Paul Reiners | 2010-04-06
Vous devez vous connecter pour publier un commentaire.
Comme dans Exécuteur testamentaire.execute() Javadoc:
Donc, la méthode
execute()
retourne immédiatement en vous laissant pas d'autre choix que d'interroger le statut de la tâche.D'autre part ExecutorService.submit():
La L'avenir.get() sera de retour seulement après le succès de la concurrence, de sorte jamais dans votre cas.
C'est également noté dans L'avenir.get() documentation:
myObject.doSomething();
est quelque chose comme une boucle infinie? Pourquoi les autres la construction d'un projet alors? Gardez à l'esprit quevoid
est parfaitement valide de valeur de retour.Je n'ai pas insinuer plutôt conclure :-). L'auteur a déclaré que "Le problème est que myObject.doSomething() ne retourne jamais" donc je suppose que cette fonction est quelque chose comme une boucle infinie (comme le thread du serveur ou qqch).
Oui .. Comment voulez-vous alors expliquer qu'il "fait retour" lors de l'utilisation de
execute()
au lieu desubmit()
?Il "retourne" lors de l'utilisation de 'exécuter' puisque la chose est juste mis le feu quelque part, et il ne le fait jamais attendre qu'elle se termine. Lors de l'utilisation de submit() il n'attendez qu'elle se termine, mais il ne fait jamais complète . Si vous utilisez un treadpoolExecutor il y a 2 raisons possibles: 1. l'exécuteur testamentaire est liée excuting quelque chose d'autre. 2. Le doSomething() ne retourne jamais. par exemple, c'est une boucle infinie.
+1 pour la lecture de la question et de briser à travers la confusion de l'OP
OriginalL'auteur pajton
J'ai créé un SSCCE:
Il fonctionne parfaitement bien. C'premières impressions
puis, après une seconde de vous voir
Donc, ton problème est ailleurs. Je vais dupliquer mon commentaire sur votre question ici:
OriginalL'auteur BalusC
Java, les futures sur le blocage!
get(). This method blocks the current thread until a future instance completes its work, thus requiring the use of one thread more than the work that must be performed just to manage what happens when it is done
OriginalL'auteur anish
Vérifier une impasse(s) dans
doSomething
.Je voudrais commencer par la recherche de
wait
appels.Si vous
wait
pour quelque chose, vous devez signaler l'objet que vous êtes en attente pour de l'autre thread en appelantnotify
ounotifyAll
.OriginalL'auteur Alexander Pogrebnyak