Il peut être parfois utile de créer des threads en tâche de fond, dans le but d'exécuter des tâches qui nécessitent beaucoup de temps. Justement, Sun Microsystems a développer la classe SwingWorker à cet effet.

La classe de SwingWorker est mise en oeuvre dans le fichier SwingWorker.java, disponible en téléchargement sur le site de Sun Microsystems.

La classe SwingWorker s'occupe de l'implémentation d'un thread se déroulant en tâche de fond. Bien que beaucoup de programmes n'aient pas besoin de ce genre de threads, ils peuvent s'avérer nécessaires pour accomplir de longues opérations, comme le chargement d'images ou la construction de tout objet lourd. Ceci améliorera sans conteste le fonctionnement d'un programme.

L'emploi de la classe SwingWorker, nécessite en premier lieu d'étendre la classe SwingWorker. La sous-classe doit implémenter la méthode construct(). Cette méthode doit contenir le code destiné à exécuter la longue tâche.

public class MonThread extends SwingWorker {
    //...
    public Object construct(){
        //Construction graphique...
        return objet;
    }
    //...
}

Ensuite, il suffit d'instancier la sous-classe de SwingWorker, puis de démarrer la tâche à partir de l'objet résultant en invoquant la méthode start(). Cette dernière se charge d'appeler la méthode construct() auparavant définie.

MonThread tache = new MonThread();
tache.start();

En cas d'un besoin ponctuel, il est possible de créer une classe anonyme à partir de la classe SwingWorker.

SwingWorker tache = new SwingWorker() {
    public Object construct() {
        //Construction graphique...
        return Object;
    }
};
tache.start();

S'il est nécessaire de récupérer l'objet retourné par la méthode construct(), il faut appeler la méthode get() de la classe SwingWorker.

Object objet = MonThread.get();

L'utilisation de la méthode get() est susceptible de provoquer un blocage du programme. Une solution consisterait à invoqué la méthode interrupt() sur l'instance de la classe SwingWorker, puis d'appeler la méthode get().

tache.interrupt();
Object  objet = tache.get();

En fait, si un traitement particulier doit être opéré sur l'objet retourné par la méthode construct(), il est préférable de rester dans le cadre de la classe SwingWorker et de confier ce traitement à la méthode finished(). Cette méthode est exécutée aussitôt après que la méthode construct() ait retournée sa valeur. Ainsi, il devient inutile de prendre des risques avec la méthode get().

public class MonThread extends SwingWorker {
    Object objet = null;
    //...
    public Object construct(){
        //Construction graphique...
        return objet;
    }
    //...
    public void finished(){
        traitement(objet);
    }
}