Предотвратите сбой автомобилей на перекрестке в Ява - PullRequest
3 голосов
/ 19 июня 2010

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

альтернативный текст http://i49.tinypic.com/ogat8h.jpg

Что мне использовать?

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

  • wait () / notify () / notifyAll ()

  • ThreadPanels

  • Canvas (кстати что такое Canvas и его назначение? )

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

Вот мой код:

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 ]

3 голосов
/ 19 июня 2010

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

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

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

1 голос
/ 19 июня 2010

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

. Вы можете попробовать CountDownLatch.

.
...