Thread

Fermé
helloworld95 - 1 déc. 2018 à 15:26
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 1 déc. 2018 à 18:20
Bonjour,

J'ai plusieurs thread en java qui run en même temps et jaimerai retenir le thread qui à fini le premier. Je pourrai le mettre dans un attribut (String) mais comment empecher alors mes autres thread d'écrire par la suite ?



Configuration: Windows / Chrome 70.0.3538.110

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 déc. 2018 à 15:51
Bonjour,

Tu peux créer un ThreadGroup puis mettre chaque Thread dans ce groupe, le premier Thread qui termine interrompt le ThreadGroup ce qui va interrompre tous les Threads non terminés.

public class MyThread extends Thread {
    public MyThread(ThreadGroup group, String name) {
        super(group, name);
    }

    @Override
    public void run() {
        // ...
        if (isInterrupted()) { // un autre Thread a terminé, il faut arrêter
            return;
        }
        // ...
        getThreadGroup().interrupt(); // indique aux autres Thread de terminer
    }
}
0
Merci je ne veux pas interrompre les thread volontairement. J'aimerai qu'il finissent leur job et ensuite un message s'affiche du genre "Le thread numero 5 à fini premier".
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > helloworld95
Modifié le 1 déc. 2018 à 18:23
Ok, j'avais mal compris "comment empecher alors mes autres thread d'écrire par la suite"

Mais en restant sur le principe du ThreadGroup, tu peux le personnaliser pour lui ajouter une valeur qui correspond au premier Thread qui a terminé.

public class MyThreadGroup extends ThreadGroup {

    private final AtomicReference<MyThread> firstEnded;

    public MyThreadGroup(String name) {
        super(name);
        firstEnded = new AtomicReference<>(null);
    }

    public boolean setFirstEnded(MyThread thread) {
        return firstEnded.compareAndSet(null, thread);
    }

    public MyThread getFirstEnded() {
        return firstEnded.get();
    }
}

public class MyThread extends Thread {

    public MyThread(MyThreadGroup group, String name) {
        super(group, name);
    }

    @Override
    public void run() {

        // ...

        if (((MyThreadGroup) getThreadGroup()).setFirstEnded(this)) {
            System.out.println("Je suis le premier à finir.");
        } else {
            System.out.println("Je ne suis pas le premier à finir.");
        }
    }
}
0