gpt4 book ai didi

java - 在这种多线程情况下,有哪些好的同步策略?

转载 作者:行者123 更新时间:2023-12-02 07:14:06 25 4
gpt4 key购买 nike

我有两个主线程。一个生成新线程,另一个监听结果,如下所示:

//Spawner
while(!done) {
spawnNewProcess(nextId, parameters);

myListener.listenFor(nextId);

nextId ++;
}

spawnNewProcess 方法所花费的时间差异很大。当它完成时,它将把一个结果对象放入一个可以通过Id访问的map中。

监听器线程的运行方式如下:

//Listener
while(!done) {
for (int id : toListenFor) {
if (resultMap.contains(id)) {
result = resultMap.get(id);

toListenFor.remove(id);

process(result);
}
}
}

我无法更改spawnNewProcess 方法,也无法更改它存储结果的方式。我想要做的是设置可以同时进行的最大限制。我的第一个倾向是让一个变量跟踪这个数字。如果超过最大值,则生成器会等待。当结果返回时,监听器会通知它。像这样:

//Spawner2

AtomicInteger numSpawns = new AtomicInteger(0);
int maxSpawns = 10;

while(!done) {
if (numSpawns.intValue() >= maxSpawns) {
this.wait(0);
}
numSpawns.getAndIncrement;

spawnNewProcess(nextId, parameters);

myListener.listenFor(nextId);

nextId ++;
}

监听者是:

//Listener2
while(!done) {
for (int id : toListenFor) {
if (resultMap.contains(id)) {
result = resultMap.get(id);

toListenFor.remove(id);

numSpawns.getAndDecrement();
Spawner.notify();

process(result);
}
}
}

这行得通吗?我是否遗漏了潜在的僵局?如果同时运行 11 或 9 个生成而不是 10 个,那也不是什么大问题。或者是否有更好的方法,我没有注意到?

最佳答案

使用 Semaphore .

import java.util.concurrent.Semaphore;
private Semaphore sem = new Semaphore(NUM_MAX_CONCURRENT);

// Spawner
while(!done) {

sem.acquire(); // added by corsiKa

spawnNewProcess(nextId, parameters);

myListener.listenFor(nextId);

nextId ++;
}

// listener
while(!done) {
for (int id : toListenFor) {
if (resultMap.contains(id)) {
result = resultMap.get(id);

toListenFor.remove(id);
sem.release(); // added by corsiKa
process(result);
}
}
}

关于java - 在这种多线程情况下,有哪些好的同步策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15164747/

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