ScheduledThreadPoolExecutor (qui implémente ScheduledExecutorService) semble exécuter uniquement la classe SwingWorker une fois lors de l'utilisation de la méthode ScheduleAtFixedRate. Le code d'origine est un peu long, j'ai donc fait un nouveau code qui produit les mêmes résultats ci-dessous.ScheduledThreadPoolExecutor exécute uniquement Swingworker une fois
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class ScheduledThreadPoolExecutorTest extends SwingWorker<Void, Void>{
@Override
protected Void doInBackground() {
System.out.println("Yay!");
return null;
}
@Override
protected void done() {
try {
get();
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("Woohoo!");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new ScheduledThreadPoolExecutorTest(), 0, 30, TimeUnit.MILLISECONDS);
}
});
}
}
Cela donne les résultats:
Yay!
Woohoo!
Pourquoi ScheduledThreadPoolExecutor en cours d'exécution SwingWorker une seule fois? Et que puis-je faire pour que le SwingWorker soit exécuté toutes les 30 millisecondes comme indiqué dans le code?
Donc 'doInBackground()' est seulement appelé une fois par classe et pas une fois par instance de cette classe? Et aussi, que se passe-t-il si vous devez absolument utiliser SwingWorker parce que vous utilisez des objets Swing et que vous devez appeler 'repaint()' (non représenté ici, bien sûr, mais dans le code original)? – ICanCYou
@ICanCYou: ça s'appelle une fois par instance - vous ne créez qu'une seule instance. –
@ICanCYou: vous pouvez également créer plusieurs SwingWorkers en cas de besoin ou faire la file d'attente Swing appelle sur le thread d'événement en utilisant SwingUtilieis. Notez que 'repaint()' n'a pas besoin d'être appelé sur le thread d'événement. –