Simulation de la synchronisation des déplacements

Fermé
imdifrent Messages postés 12 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017 - 25 déc. 2016 à 14:51
imdifrent Messages postés 12 Date d'inscription dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017 - 26 déc. 2016 à 18:38
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 déc. 2016 à 22:59
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 dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017
Modifié par imdifrent le 26/12/2016 à 13:21
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 dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017
26 déc. 2016 à 15:28
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
26 déc. 2016 à 18:23
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 dimanche 3 mai 2015 Statut Membre Dernière intervention 25 avril 2017 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
26 déc. 2016 à 18:38
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