Java 使用信号量进行流量同步

Java 使用信号量进行流量同步,java,multithreading,java-7,semaphore,Java,Multithreading,Java 7,Semaphore,我正在尝试为流量同步问题编写代码。 我的做法是: 我将交通广场划分为4个象限,我已经为东西南北方向实施了4个线程,车辆可能从该方向接近广场 任何接近广场的车辆都将在象限上获得专用锁,其他车辆将等待该车辆通过广场 我使用信号量来解决这个问题。在此处粘贴我的代码: 这是我的主要课程: public class MainClass { public static void main(String[] args) { MyThreadClass t1 = new MyThrea

我正在尝试为流量同步问题编写代码。 我的做法是:

  • 我将交通广场划分为4个象限,我已经为东西南北方向实施了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;
            }
        }
    }
    
    现在我的问题是我得到了所有四个象限的锁。如果车辆想直行,我无法找到解决方案。在这种情况下,只有两个象限需要一个锁,与之相对的线程可以锁定其余象限

    我处理这个问题的方法正确吗?
    谢谢

    正方形上每个象限将有四个信号灯

         N
       1 | 2
    W  ------ E
       3 | 4
         S
    
    和四个螺纹,用于每侧来的车辆

    每个车辆线程将生成随机数(就像您现在所做的那样)来决定哪一个 转向方向(左、右、直)

    根据您驾驶的是英式(左侧驾驶)还是美式(右侧驾驶),获取相应象限信号灯上的锁。 e、 你要从南到北:英式:先获得信号灯3,然后获得信号灯1;美式:先获得信号灯4,然后获得信号灯2

    class LockOrder{
       List<Integer> leftTurn()
       List<Integer> rightTurn()
       List<Integer> straight()
    }
    
    类锁顺序{
    列表leftTurn()
    列表右转弯()
    直选
    }
    

    为车辆的每个方向创建四个对象锁定顺序。

    两条注释:首先,您可以使用普通的旧互斥(
    Object
    lock)代替信号灯。这里的信号量没有什么特别的错误,但是信号量通常在线程等待访问多个资源池时使用——在本例中,每个象限都是独立的单个资源。其次(我还没有看过你的代码)当车辆笔直行驶时,你必须确保a)如果车辆不能同时获得两个象限,那么它一个象限都没有,或者b)车辆一次只能保持一个象限。您的选择,但它将避免僵局。正如JasonC所指出的,象限是这里的“有限资源”。这些车辆声称“资源有限”。通常,这意味着车辆是希望锁定象限对象的线程(或更好的:可运行线程),而不是反过来。