gpt4 book ai didi

java - 在Java中使用相同变量的线程

转载 作者:行者123 更新时间:2023-12-03 13:10:17 24 4
gpt4 key购买 nike

我正在使用线程,但有一个问题,因为我的线程使用的是基于其他类的其他线程创建的相同变量。
问题在于此代码:

public void run() {
int cityID = 0;
int requestID = 0;
boolean inBase = true;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (inBase == true) {
for (cityID = 0; cityID < world.getCities().size(); cityID++) {
if ((!world.getCities().get(cityID).getRequestsList().isEmpty()) && (inBase == true)) {
for (requestID = 0; requestID < world.getCities().get(cityID).getRequestsList()
.size(); requestID++) {
if (world.getCities().get(cityID).getRequestsList().get(requestID).isRequest() == true) {
world.getCities().get(cityID).getRequestsList().get(requestID).setRequest(false);
System.out.println(Thread.currentThread().getName() + " is flying to "
+ world.getCities().get(cityID).getName());
inBase = false;
break;
}
}
}
}
}
}

结果是:
City 859|342 is sending request for airplane. . .
City 328|669 is sending request for airplane. . .
City 718|287 is sending request for airplane. . .
Airplane kS-2 is flying to City 859|342
Airplane kS-1 is flying to City 859|342

如您所见,飞机正在飞往同一座城市,这是错误的。
不知道该怎么办才能防止这种情况,因为我已经做好了条件
if world.getCities().get(cityID).getRequestsList().get(requestID).isRequest() == true)

然后我将此值更改为false
world.getCities().get(cityID).getRequestsList().get(requestID).setRequest(false);

但是线程在同一时间寻找相同的值,所以我所能做的就是随机 sleep 每个时间,然后他们将不会在同一时间检查真实值,但是使用随机值我仍然可以获得两个相同的值,所以飞机有时会飞向同一目标。
我认为有更好的方法可以做到,但一无所知。请帮忙。

最佳答案

我看到的方式是,所有线程都可以同时访问同一请求列表,而不是循环遍历

world.getCities().get(cityID).getRequestsList()

让您的列表表现得像一个堆栈,并一一弹出请求。这样,每次弹出都会给您的线程一个单独的请求。

关于java - 在Java中使用相同变量的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com