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();

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.

Vous vous posez à propos du comportement de 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