gpt4 book ai didi

java - 使用信号量进行流量同步

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:41 24 4
gpt4 key购买 nike

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

  1. 我将交通广场分为 4 个象限,并且我已经为东西南北方向实现了 4 个线程,车辆可以从这些线程接近广场。
  2. 任何接近广场的车辆都会获得该象限的独占锁定,其他车辆将等待该车辆通过广场。
  3. 我正在使用信号量来解决这个问题。将我的代码粘贴到此处:

这是我的主课:

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 个象限需要锁,而与之相对的线程可以获得其余象限的锁。

我解决问题的方法正确吗?谢谢

最佳答案

正方形上的每个象限有四个信号量。

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

每侧都有四个线程用于车辆。

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

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

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

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

关于java - 使用信号量进行流量同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020915/

24 4 0
文章推荐: java - 反序列化对象时出现 EOFException
文章推荐: html - 根据屏幕大小限制表格行数
文章推荐: html - 使
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com