2010-12-11 9 views

Répondre

0

Votre réponse est dans le Javadoc que vous avez mentionné vous-même. Apparemment, la méthode va bloquer le premier thread jusqu'à ce que le second thread appelle la méthode.

2

L'échangeur ne bloque pas un filetage, il provoque l'attente du premier filetage atteignant l'échangeur.

1

Le premier thread appelant change son état de WAITING

Un extrait de code simple pour voir ce qui se passe:

public class ExchangerTest { 

    public static void main(String[] args) throws InterruptedException { 
     final Exchanger<Long> ex = new Exchanger<Long>(); 

     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("thread 1"); 
       try { 
        ex.exchange(10L); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
       } 
      } 
     }); 
     t1.start(); 
     Thread.sleep(500); //give t1 time to start 
     System.out.println(t1.getState()); 
    } 
} 
2

Pour être clair, il y a six états de fil: nouveau, RUNNABLE, obstruées, EN ATTENTE, TIMED_WAITING et TERMINÉ.

Dans votre scénario, le premier thread passera de RUNNABLE à WAITING et restera en attente jusqu'à ce que le second thread arrive.

L'état BLOQUÉ est utilisé lorsqu'un thread est bloqué en attendant d'acquérir un mutex. Dans ce cas particulier, le premier thread est celui qui acquiert le mutex en premier, et par conséquent il ne passera pas en état BLOCKED à ce moment. Cependant, il est possible que le deuxième thread passe momentanément en état BLOQUÉ lorsqu'il arrive, ou que le premier thread passe momentanément en état BLOQUÉ après en recevant la notification.