Предотвратите сбой автомобилей на перекрестке в Ява

Я сделал Java-приложение для 4-х сторонней развязки. Я могу перемещать все автомобили через перекресток с помощью THread.sleep(), но мне нужно, чтобы автомобили не врезались друг в друга. (См. Схему)

http://i49.tinypic.com/ogat8h.jpg

Что я должен использовать?

  • синхронизация

  • ждать ()/ уведомляет ()/ notifyAll ()

  • ThreadPanels

  • Холст (кстати, что такое холст и его назначение?)

Я использовал слоистую панель для размещения изображений друг на друге.

Вот мой код:

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JLayeredPane;

import javax.swing.JPanel;

public class Gui {

private JFrame f = new JFrame("Traffic Light");
private JLayeredPane lp = new JLayeredPane();
private JPanel red = new JPanel();
private JPanel car_1 = new JPanel();
private ImageIcon northcar = new ImageIcon("src/north.gif");
private ImageIcon usIcon = new ImageIcon("src/trafficLight.jpg");
private JLabel lb = new JLabel(usIcon);
private JLabel lbcar_1 = new JLabel(northcar);


/*private ImageIcon southcar = new ImageIcon("src/trafficLight.jpg");
private ImageIcon westcar = new ImageIcon("src/trafficLight.jpg");
private ImageIcon eastcar = new ImageIcon("src/trafficLight.jpg");
 */
public Gui() {

    f.setBounds(0, 0, 655, 679);
    f.add(lp);




    car_1.setOpaque(false);
    car_1.setBounds(340, 120, 70, 105);
    //car_1.setBackground(Color.black);
    car_1.add(lbcar_1);




    red.setBounds(0, -5, 650, 650);
    red.add(lb);



    lp.add(red, new Integer(0));
    lp.add(car_1, new Integer(1));


    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    try {
    for (int i = 120; i < 540; i +=1){
            Thread.sleep(10);
            car_1.setBounds(340, i, 70, 105);

        } }catch (Exception e) {
        }


    }

   public static void main(String[] args) {


    Gui frame = new Gui();






   }
   }

Любая помощь приветствуется. Спасибо за ваше время.

Большое спасибо

2 ответа

Решение

Вы можете представить себе 4 общих ресурса, к которым вам нужно синхронизировать доступ: четыре угла "соединения". Чтобы пересечь улицу, каждая машина должна сначала войти в ближайший к ним угол, затем в следующий угол.

Однако, если вы заблокируете каждый угол отдельно, вы можете попасть в тупик (параллелизм, эквивалентный блокировке в вашем примере) из- за проблемы Обедающего Философа. Это происходит, когда все четыре машины входят ("блокируют") в ближайший квадрат, и все они ждут следующего автомобиля по часовой стрелке, чтобы очистить второй квадрат. Смотрите эту ссылку для решения.

Рассматривая пересечение как четыре ресурса, это, конечно, только одно решение. Вы также можете рассмотреть возможность рассматривать все пересечение как ресурс, как было предложено (аналогично остановке на всем пути, но не совсем), хотя это также не отражает реальный поток трафика. Вы также можете установить правила синхронизации для четырех углов, которые отражают светофор.

Если вы не назначаете одну из дорог "главной", а другую - второстепенной. Иначе даже в реальной жизни нет способа определить, какой автомобиль должен ехать первым.

Ты можешь попробовать CountDownLatch,

Другие вопросы по тегам