7
votes

Un moyen plus facile de synchroniser 2 threads en Java?

Je ne serai pas sûr que certains morceaux de mon code dans le fil principal seront exécutés après un morceau de code exécuté avec le fil secondaire. Voici ce que j'ai eu: xxx

  1. est-ce correct une solution?
  2. Toutes les façons plus courtes de faire la même chose?

0 commentaires

4 Réponses :


13
votes

choses comme notifier () et wait () sont des primitives de synchronisation de bas niveau.

Vous devez utiliser des abstractions de niveau supérieur chaque fois que possible, comme dans cette Cas, disons, un compte à rebours .

Ce qui suit n'est qu'un exemple qui devrait vous aider à démarrer (par exemple, les problèmes de délai d'attente ne sont pas pris en compte ici): xxx

des choses de bas niveau comme wait et avertiez sont vraiment des idiosynchrases Java de bas niveau que vous ne devriez pas être préoccupée par (Sauf si vous écrivez des API de concurrence).

En outre, je suggérerais de lire le livre incroyable: Java Concurrence dans la pratique .


0 commentaires

5
votes

En supposant que votre fil principal doit initier le traitement du fil secondaire, un échangeur serait la solution la plus simple.

Si le fil secondaire est indépendant, alors une forme de BlockingQueue serait approprié.


Exemple utilisant l'échangeur (avec une manipulation d'exception appropriée). L'échangeur peut être remplacé par deux files d'attente. xxx


4 commentaires

@Jeffrey - merci. J'ai pris les liens que Google m'a donné, sans vérifier la version JDK.


@John - Il y a des raisons pour desquelles il y a beaucoup de code multi-fileté brisé. IMO Le plus grand est que les gens ne pensent pas à communiquer entre les threads.


@parisfal Quelqu'un a probablement vu un échangeur et n'avait aucune idée de ce que cela signifiait aussi A -1?


@parsifal: merci pour échangeur , qui résout le prochain problème que je voulais poster.



-1
votes
final Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println("qwerty");
    }
});

t.start();
t.join();

System.out.println("absolutely sure, qwerty is above");

1 commentaires

Il suffit de voir que pendant que cela résout l'exemple primitif ci-dessus, il ne fait pas quelle est la question spécifiée si le sous-organisme devrait faire autre chose ...



-4
votes

La meilleure solution pour le code que vous avez donné est la suivante:

System.out.println("qwerty");
System.out.println("absolutely sure, qwerty is above");


0 commentaires