Je suis nouveau avec Javafx et j'ai un petit problème avec un fil: je peux l'exécuter deux fois et je ne trouve pas pourquoi.
Voici une somme de mon code: P>
Task<Void> task = new Task<Void>() { @Override public Void call() throws ImageLoadedException, HomographyException, IOException { try{ System.out.println("GO !"); return null; } catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void succeeded() { super.succeeded(); System.out.println("SUCCEEDED"); } }; @FXML protected void launch(ActionEvent event){ new Thread(task).start(); }
3 Réponses :
du .start () Documentation: Non STRUT> Il n'est jamais légal de commencer un fil plus d'une fois. En particulier, un
Le fil peut ne pas être redémarré une fois qu'il a terminé l'exécution. P>
blockQuote> du Concurrence à JavaFX Tutoriel: P> La classe de tâches définit un objet ponctuel qui ne peut pas être réutilisé. Si tu
Besoin d'un objet de travailleur réutilisable, utilisez la classe de service. P>
blockQuote> Donc, vous devez envisager le Service classe plutôt que Tâche . P> EDIT STRUT>: Cela devrait fonctionner pour vous: P>
Service de service = nouveau service <> (tâche> p>
Merci beaucoup pour votre aide. Je vais chercher ça maintenant :)
N'oubliez pas de définir l'exécuteur vous-même et de réutiliser cela ou vous créez toujours de nouveaux threads partout.
@AndyTILL Pouvez-vous suggérer une meilleure approche?
Normalement, il y aurait beaucoup de cours de service et les réinitialiserait toujours à laisser un thread (exécuteur) par service. Réutiliser l'objet exécuteur en appelant le service SetExecutor et la création d'une nouvelle instance du service vous permettra de réutiliser les threads créés par cet exécuteur, s'il est configuré.
le faire avec une classe wrapper
avec un bouton peut déclencher de nouvelles tâches
Non, vous ne pouvez pas utiliser de fil plus d'une fois.