3.5.1 Exemple - String print - sans  synchronisation


class TwoStrings {
     void print(String str1,String str2) {
        System.out.print(str1);
        try {
            Thread.sleep(50);
        } catch (InterruptedException ie) {        }
        System.out.println(str2);
    }
}

class PrintStringsThread extends Thread {
     String str1, str2;
     TwoStrings ts;
     PrintStringsThread(String str1, String str2,     TwoStrings ts) {
        this.str1 = str1;
        this.str2 = str2;
        this.ts = ts;
        this.start(); 
    }
    public void run() {
            ts.print(str1, str2);
    }
}

public class App {
    public static void main(String args[]) {
         TwoStrings ts = new TwoStrings();
        new PrintStringsThread("Hello ", "there.",ts);
        new PrintStringsThread("How are ", "you?",ts);
        new PrintStringsThread("Thank you ", "very much!",ts);
    }
}
How are Hello Thank you there.
you?
very much!

 

    3.5.2 Approche: Méthode synchronisée

class TwoStrings {
synchronized void print(String str1,String str2) {
System.out.print(str1);
try {
Thread.sleep(50);
} catch (InterruptedException ie) { }
System.out.println(str2);
}
}

class PrintStringsThread extends Thread {
String str1, str2;
TwoStrings ts;
PrintStringsThread(String str1, String str2, TwoStrings ts) {
this.str1 = str1;
this.str2 = str2;
this.ts = ts;
this.start();
}
public void run() {
ts.print(str1, str2);
}
}

public class App {
public static void main(String args[]) {
TwoStrings ts = new TwoStrings();
new PrintStringsThread("Hello ", "there.",ts);
new PrintStringsThread("How are ", "you?",ts);
new PrintStringsThread("Thank you ", "very much!",ts);
}
}
Hello there.
Thank you very much!
How are you?

 

 
    3.5.3 Approche: Objet synchronisé

class TwoStrings {
void print(String str1,String str2) {
System.out.print(str1);
try {
Thread.sleep(50);
} catch (InterruptedException ie) { }
System.out.println(str2);
}
}

class PrintStringsThread extends Thread {
String str1, str2;
TwoStrings ts;
PrintStringsThread(String str1, String str2, TwoStrings ts) {
this.str1 = str1;
this.str2 = str2;
this.ts = ts;
this.start();
}
public void run() {
synchronized (ts) {
ts.print(str1, str2);
}
}
}

public class App {
public static void main(String args[]) {
TwoStrings ts = new TwoStrings();
new PrintStringsThread("Hello ", "there.",ts);
new PrintStringsThread("How are ", "you?",ts);
new PrintStringsThread("Thank you ", "very much!",ts);
}
}
Hello there.
How are you?
Thank you very much!

 


    3.5.4 Exemple - pont à sens unique ayant les règles:

  1. Une voiture prend le pont si  le pont est libre ou bien  sur le pont il y a des voitures allant dans la même direction.
  2. Si des voitures venant de l’autre sens arrivent alors qu’il y a des voitures sur le pont, les voitures opposées attendent que le pont soit dégagé.

pont - resource

public class Bridge {
    private int nVh;
    Bridge(){
        nVh = 0;        
    }
    synchronized public int brN(){
        return nVh;
    }
    synchronized public void takeB(boolean lr ){
        while((nVh>0)&& (lr==true)||
              (nVh<0) && (lr==false)){
            System.out.println("\t"+Thread.currentThread().getName()+" waiting");
            try{     wait();   }
            catch(InterruptedException e){
                System.err.println(e);
            }
        }
        if (lr) nVh--;
        else nVh++;
        System.out.println(Thread.currentThread().getName()+" on the bridge");
    }
    synchronized public void leaveB(boolean lr ){
        if (nVh>0) nVh--;
        else nVh++;
        System.out.println("\t\t"+Thread.currentThread().getName()+" leave the bridge");
        notifyAll();
    }
}

voitures - threads

public class Vehicle extends Thread{
    boolean lr;
    Bridge b;
    String name;
    static int num;
    Vehicle(boolean lr, Bridge b){
        this.lr=lr;
        this.b = b;
        name = "V "+ ++num + (lr?" left->":" <-right");
        super.setName(name);
    }
    public void run(){
        b.takeB(lr);
        try {
            sleep(800);
        } catch (InterruptedException e){} 
        b.leaveB(lr);
    }
}

Le modèle:

public class Circ {
    public static void main(String arg[]){
        Bridge b = new Bridge();
        for(int i = 0; i < 20; i++){
            (new Vehicle(Math.random()>0.5?true:false, b)).start();
        }
    }
}

    3.5.5 Modifiez le programme pour introduire la regle:

 Le pont ne devrait pas être bloqué par un flot sans fin de voitures venant d'une seule direction.

    3.5.6 Exemple

Deux ponts à  sens unique. Une place sans restriction des places entre les deux. Gênerez  un  nombre par hasard des voitures qui doivent passer. Chaque voiture attend un temps par hasard avant de passez et perd un certain temps en passant. Pour entrer sur le pont il ne faut pas avoir des voitures qui roulent en sens inverse.  Faire un programme en Java pour modeler la situation.

Si le nombre des places entre deux ponts est limité la tâche devient beaucoup plus compliqué!  Pour ceux qui aiment les défis!