我正在尝试编码流量同步问题。 我的方法是:
这是我的主要课程:
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个象限需要锁定,与其相对的线程可以锁定其余部分。
我对这个问题的处理方法是否正确? 感谢
答案 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。