2014-04-30 3 views
-2

Je rencontre des problèmes de simultanéité étranges que j'espère que quelqu'un peut m'aider avec. Ce est le code en question: http://pastebin.com/HuDqknNZProblème de simultanéité Java étrange avec ThreadPool

Pour une raison que je dois avoir

executor.execute(new Runnable(){ 
     @Override 
     public void run() {} 
}); 

placé à l'intérieur du constructeur. Si ce n'est pas le cas, le programme va se bloquer après un certain temps (environ 20 secondes). Cela n'a absolument aucun sens pour moi, car le Runnable ne fait rien, mais d'une manière ou d'une autre il affecte l'exécuteur et prévient les plantages.

+3

Pouvez-vous poster une trace de pile ou tout ce que vous entendez par l'accident? – lpiepiora

+0

De même, comment la classe est-elle utilisée par un autre code? –

+0

Oh oui, désolé j'ai oublié de mentionner que je ne reçois aucune exception ou pile de traces - C'est comme si System.exit (0) est déclenché. Tout ce que je reçois est "BUILD SUCCESS" (comme NetBeans montre généralement quand un programme se termine avec succès) –

Répondre

1

Aucun filetage n'est requis dans votre classe EventManager.

Je suppose, il est utilisé comme écouteur et maintenez le EventExecutors. Lorsque le feu a même tiré, les organisateurs de l'événement ficher et de tirer.

S'il n'y a aucun événement votre MainProgam (autres que Event Manager) en train de fermer l'application (Vous ne l'avez pas montré Quel est le programme principal et comment l'utiliser EventManager et ce qui est Event dans votre contexte)

private final ExecutorService executor = Executors.newFixedThreadPool(5); 

executor.execute(new Runnable(){ 
      @Override 
      public void run() {} 
     }); 

Les lignes ci-dessus ne font aucune activité dans votre programme. C'est juste arrêter le système/JVM de descendre. Une fois que vous commencez à l'exécuteur, vous devez appeler shutdown() pour fermer la ExecutorService - Vérifiez votre méthode Shutdown dans EventManager classe

C'est pourquoi sans ce bloc votre code d'arrêter (dans votre accident de la terminologie) après 20 minutes (après tous les événements exécutés Probablement). Si vous avez ceci dans votre constructeur alors vous devez appeler shutDown pour l'abattre, sinon il restera en ligne.

Et ce n'est pas moyen approprié d'attendre une event

MISE À JOUR:

An unused ExecutorService should be shut down to allow reclamation of its resources 

de Java API

+1

Le thread ne doit-il pas simplement exécuter la méthode 'run()' et revenir au pool de threads, puisque 'run()' se termine immédiatement? Pourquoi empêcherait-il JVM de se fermer? –

+0

@BorisB. C'est aussi ma compréhension de la façon dont les choses fonctionnent et c'est pourquoi je me demande pourquoi le Runnable vide empêche l'application de s'écraser. Dans mon esprit, cela ne devrait avoir aucun effet. –

+1

Il s'agit d'un ThreadPool qui attend la requête. Vous devriez appeler Shutdown pour terminer explicitement. Vérifiez la méthode Finalize de ThreadPoolExecutor. il appelle shutdown explicite. Lorsque vous utilisez ExecutorService, vous devez appeler shutdown. essayez d'écrire un programme simple https://ideone.com/W5jiVi – Mani