Exchanger

Echange des objets entre threads en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Dans le passé on échangeait trois poules contre une vache. Aujourd'hui on vendrait ces poules pour acheter une vache. Malgré ce bouleversement social, Java offre une possibilité d'échanger des objets entre deux Threads.

Tout cela grâce à la classe Exchanger du package java.util.concurrent. Deux Threads participent dans une transaction. Chacun produit un objet dont a besoin l'autre. Dès que les deux objets sont prêts, une échange se déroule. Regardons cela sur notre exemple avec 3 poules et 1 vache :

import java.util.concurrent.Exchanger;

public class ExchangerExemple {
    public static void main(String[] args) {
        Exchanger<Animal> exchanger = new Exchanger<Animal>();
        Thread t1 = new Thread(new Farmer("Poultry farmer", exchanger, new Animal("3 chickens")));
        Thread t2 = new Thread(new Farmer("Beef man", exchanger, new Animal("1 cow")));
    
        t1.start();
        t2.start();
    } 
}

class Farmer implements Runnable {
    private String name;
    private Animal animal;
    private Exchanger<Animal> exchanger;
  
    public Farmer(String n, Exchanger<Animal> e, Animal a) {
        name = n;
        exchanger = e;
        animal = a;
    }
  
    public String getName() {
        return name;
    }

    public void run() {
        try {
            Animal givenAnimal = animal;
            animal = (Animal) exchanger.exchange(animal);
            System.out.println(name + " gives " + givenAnimal.getName() + " and receives " + animal.getName());
        } catch (InterruptedException e) {
            System.out.println("An InterruptedException occured " + e.getMessage());
        }
    }
}

class Animal {
    private String name;
  
    public Animal(String n) {
        name = n;
    }
  
    public String getName() {
        return name;
    }
}

Voici le résultat :

Poultry farmer gives 3 chickens and receives 1 cow
Beef man gives 1 cow and receives 3 chickens

On remarque la présence d'une instance de la classe Exchanger. Elle possède une méthode exchange() qui est appelée par les deux Threads participant à l'échange. Cette fonction retourne l'objet que la classe est censée de recevoir. L'échange se déroule quand deux objets échangés sont prêts.

Bartosz KONIECZNY Concurrence

Une question ? Une remarque ?

*

*

Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil CSS

Comment centrer verticalement les inputs type radio et checkbox ?

L'alignement vertical des inputs radio et checkbox peut se faire avec la propriété CSS, vertical-align. Par exemple :

<input type="radio" name="typeUser" id="pro-1" style="vertical-align:top;"/><label for="pro-1">Professionnel</label>