使用信号量进行流量同步

时间:2014-02-25 16:53:22

标签: java multithreading java-7 semaphore

我正在尝试编码流量同步问题。 我的方法是:

  1. 我将交通广场划分为4个象限,并且我已经实施了4条线程用于东西南北方向,车辆可能从该方向接近广场。
  2. 任何接近广场的车辆都将获得对象限的独家锁定,其他人将等到该车辆驶过广场。
  3. 我正在使用信号量来解决问题。在这里粘贴我的代码:
  4. 这是我的主要课程:

    public class MainClass {
    
        public static void main(String[] args) {
            MyThreadClass t1 = new MyThreadClass();
            Thread east = new Thread(t1, "east");
            Thread west = new Thread(t1, "west");
            Thread north = new Thread(t1, "north");
            Thread south = new Thread(t1, "south");
    
            east.start();
            west.start();
            north.start();
            south.start();
        }}
    

    和其他实现信号量的文件是:

    import java.util.concurrent.Semaphore;
    
    public class MyThreadClass implements Runnable {
    
        Semaphore s = new Semaphore(1, true);
        String direction[] = {"left", "straight", "right"};
        @Override
        public void run() {
            // TODO Auto-generated method stub
    
            int dirNo = generateRamdomNumberForDirection();
            String directionSelected = direction[dirNo];
    
            try
            {
                s.acquire();
                getLock(directionSelected , Thread.currentThread().getName());
                s.release();
            }
            catch(Exception e){ }
            //getLock(directionSelected);
        }
    
        private int generateRamdomNumberForDirection()
        {
            int Min = 0;
            int Max = direction.length;
            return Min + (int)(Math.random() * ((Max - Min) ));
        }
    
        private synchronized void getLock(String dir , String threadName)
        {
            switch(Thread.currentThread().getName())
            {
            case "east":
                    if (dir.equals(direction[0]))
                    {
                        System.out.println("lock on north east, north west and south west quadrant by east thread");
                    }
                    break;
    
    
            //TO BE IMPLEMENTED
            case "west":break;
            case "north":break;
            case "south":break;
            }
        }
    }
    

    现在我的问题是我正在锁定所有4个象限。如果车辆想要直行,我找不到解决方案。在这种情况下,只有2个象限需要锁定,与其相对的线程可以锁定其余部分。

    我对这个问题的处理方法是否正确? 感谢

1 个答案:

答案 0 :(得分:1)

广场上每个象限将有四个信号量。

     N
   1 | 2
W  ------ E
   3 | 4
     S

每个车辆都有四条线路。

每个车辆线程将生成随机数(正如您现在所做的那样)来决定哪个 转弯的方向(左,右,直)。

根据您是驾驶英式风格(左侧驾驶)还是美式风格(右侧驾驶),获取相应象限信号量的锁定。 例如你要从南到北:英国风格:获得信号量3然后1,美国风格:获得信号量4然后2。

class LockOrder{
   List<Integer> leftTurn()
   List<Integer> rightTurn()
   List<Integer> straight()
}

为每个方向车辆创建四个对象LockOrder。