Simulation de la synchronisation des déplacements

imdifrent Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
imdifrent Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
S'il vous plaît, est-ce qu'il y'a quelqu'un pour m' aider sur un projet de Simulation multi-threadée de la synchronisation des déplacements de robots en java
Nous nous concentrons sur l’aspect multithreadé avec la simulation graphique des robots (avec swing), en gérant leur synchronisation pendant la circulation pour éviter la collision, l’interblocage et la famine et en utilisant les sémaphores ou moniteurs (en java).
Des information sur le projet :
Les robots circulent en ligne droite dans un seul sens horizontal ou vertical.
Chaque robot qui circule doit franchir sa ligne ou sa colonne dans un temps fini
voici la partie de code de création de l'interface et les méthodes de déplacement mais j'ais rencontrer des problème
1-comment je supprime l'icon de robot dans les dernières case (Erreur marqué dans la photo ci-jointe)

2-j'ai utilisé les sémaphore (Semaphore[10][10])pour la synchronisation alors que le
problème de collision n'est pas corrigé
merci pour votre aide à l'avance
  private JFrame frmRobots;
ImageIcon robot1 = new ImageIcon("NAO_02.gif");
ImageIcon robot2 = new ImageIcon("Untitled-1_03.gif");
Semaphore s[][];

{
s = new Semaphore[10][10];
}

private ArrayList<JButton> grid = new ArrayList<JButton>();
JButton innerButton[][] = new JButton[10][10];
// autre code*********
//le rest
JButton btnStart = new JButton("START");
btnStart.setFont(new Font("Comic Sans MS", Font.BOLD, 12));
panel_1.add(btnStart);
//Demarer les thread avec un click sur le boutton
btnStart.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
new Robot1().start();
new Robot2().start();
new Robot3().start();
new Robot4().start();
}
});
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {

innerButton[i][j] = new JButton();
innerButton[i][j].setBackground(Color.white);
gridBtnPanel.add(innerButton[i][j]);
grid.add(innerButton[i][j]);
(innerButton[i][j]).setText(String.valueOf(i+","+j));
;

}
}
//initialisation des sémaphores
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++){
s[i][j]=new Semaphore(1,true);
}}

public void move1() throws InterruptedException {
int row=0;
int col=0;
while(true){


for ( col=0; col <=9; col++) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);
s[row][col].release();
if(col>=1){
(innerButton[row][col-1]).setIcon(null);


}
if(col==10)
(innerButton[row][9]).setIcon(null);
}

}}
public void move2() throws InterruptedException {

int col=0;
while(true){

//(innerButton[row][9]).setIcon(null);

for ( int row=0; row <=9; row++) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot2);
s[row][col].release();


if(row>=1){
(innerButton[row-1][col]).setIcon(null);
s[row][col].release();
}
}

}}

public void move3() throws InterruptedException {
int row=9;
int col=0;
while(true){

//(innerButton[row][9]).setIcon(null);

for ( col=9; col>= 0; col--) {
Thread.sleep(1000);
s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);

if(col<9){
(innerButton[row][col+1]).setIcon(null);
s[row][col].release();

}
}

}}
public void move4() throws InterruptedException {
int col=9;

while(true){

//(innerButton[row][9]).setIcon(null);

for ( int row=9; row>= 0; row--) {
Thread.sleep(1000);
// s[row][col].acquire();
(innerButton[row][col]).setIcon(robot1);
// s[row][col].release();

if(row<9){
(innerButton[row+1][col]).setIcon(null);

}
}

}}

public class Robot2 extends Thread{
@Override
public void run(){
try {
move2();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Robot3 extends Thread{
@Override
public void run(){
try {
move3();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public class Robot1 extends Thread {

@Override
public void run(){
try {
move1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Robot4 extends Thread {

@Override
public void run(){
try {
move4();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}}


1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Je vois plusieurs problèmes, prenons par exemple move3()

public void move3() throws InterruptedException {
    int row = 9;
    int col = 0;
    while (true) {
        for (col = 9; col >= 0; col--) {
            Thread.sleep(1000);
            s[row][col].acquire();
            (innerButton[row][col]).setIcon(robot1);
            if (col < 9) {
                (innerButton[row][col + 1]).setIcon(null);
                s[row][col].release();
            }
        }
    }
}

Ligne 7 tu fais
acquire()
mais tu ne fais le
release()
que ligne 11, à l'intérieur du if. Or si tu ne rentres pas dans le if, il ne va jamais y avoir de
release()
...

De plus, comme ton robot ne se déplace que jusqu'à la colonne 9, forcément il va rester bloqué, il n'est pas programmé pour faire autre chose.

Attention : puisque ton robot se déplace d'une case à une autre, il faut acquérir les deux cases, celle d'où il part et celle où il arrive.

Remarque : globalement ton code est très compliqué, tu pourrais notamment te passer des multiples classes Robot1,2,3,4 et move1,2,3,4 les restructurer et ne pas avoir à dupliquer les blocs de synchronisation.
Tu pourrais par exemple faire cela avec des lambdas.

Exemple :

public class Robot extends Thread {

    private Icon icon;
    private Supplier<Point> init;
    private Function<Point, Point> move;
    private Predicate<Point> finish;

    public Robot(Icon icon, Supplier<Point> init,
            Function<Point, Point> incr, Predicate<Point> finish) {
        this.icon = icon;
        this.init = init;
        this.move = incr;
        this.finish = finish;
    }

    private void acquire(Point pos) throws InterruptedException {
        s[pos.x][pos.y].acquire();
        innerButton[pos.x][pos.y].setIcon(icon);
    }

    private void release(Point pos) throws InterruptedException {
        innerButton[pos.x][pos.y].setIcon(null);
        s[pos.x][pos.y].release();
    }

    @Override
    public void run() {
        try {
            Point pos = init.get();
            acquire(pos);
            while (!finish.test(pos)) {
                Thread.sleep(1000);
                Point nextPos = move.apply(pos);
                acquire(nextPos);
                release(pos);
                pos = nextPos;
            }
            release(pos);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Robot robot1 = new Robot(
        icon1,
        () -> new Point(0, 0), // init
        point -> new Point(point.x, point.y + 1), // move
        point -> point.y == 9); // finish
1
imdifrent Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Merci beaucoup pour votre réponse c'est très intéressante je suis entraîne d'applique ce que vous dite et Je vais annoncer tous les détails.
En ce qui concerne votre code c'est quoi
private Supplier<Point> init;
private Function<Point, Point> move;
private Predicate<Point> finish
0
imdifrent Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Après exécution de code la fenêtre s'affiche mais y'a rien voila les erreur dans la console Exception in thread "Thread-2" java.lang.NullPointerException
at Robot_1.acquire(Robot_1.java:27)
 s[pos.x][pos.y].acquire();
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Supplier, Function, et Predicate sont des interfaces fonctionnelles prédéfinies dans Java 8. Il faudrait rajouter
import java.util.function.*;


Quant à ton NullPointerException c'est bizarre parce que j'ai testé le code de mon côté et ça fonctionnait. Tu devrais peut être rajouter un try/catch pour afficher en détail quelles sont les valeurs de pos.x et pos.y qui provoquent l'erreur mais normalement mon code ne change rien à l'initialisation de
s
que tu avais déjà faite.
0
imdifrent Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
OK je vais essayer .Pour le moment il n'y a pas des robots qui circule sur la matrice
En ce qui concerne mon code le problème de suppression d'icon de robot dans les dernières case est résolue mais le problème de collision n'est pas encore résolue
0