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
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所指出的,象限是这里的“有限资源”。这些车辆声称“资源有限”。通常,这意味着车辆是希望锁定象限对象的线程(或更好的:可运行线程),而不是反过来。