gpt4 book ai didi

java - 执行线程 "one by one"

转载 作者:行者123 更新时间:2023-11-30 09:42:40 25 4
gpt4 key购买 nike

有n个线程可以访问的单例类。
每个线程加载此类的实例并在循环中调用此类的方法。

我必须控制执行流程,这样每个线程都可以调用第一个方法并暂停,只有在所有线程调用该方法一次之后,才必须恢复它们的工作。线程可以以任何顺序调用方法,只是所有线程都必须在移动循环之前执行一次方法。

这是我尝试做的:

在线程中:

 while ( some condition){
ObjectType obj = theSingleton.getInstance().getSharedObject();
obj.SomeMethod(threadID);
if (obj.waitisneeded())
synchronized (obj ) {
obj.wait();
}
}

我在 SomeMethod 中做了什么:

public  synchronized void SomeMethod(String threadID) {
hashMap.put(threadID,true);
some job here
}

需要等待:

public  synchronized boolean waitisneeded(){
{

Iterator iter = hashMap.entrySet().iterator();

boolean alldone = false;

while (iter.hasNext()) {
Map.Entry me = (Map.Entry) iter.next();
String key = me.getKey().toString();
alldone = (Boolean)me.getValue();

if(!alldone) {
return false;
}
}

//set all values to false
iter = hashMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry me = (Map.Entry) iter.next();
String key = me.getKey().toString();
me.setValue(false);
}
this.notifyAll();
return true;

运行它得到了意想不到的结果和死锁。

我该如何解决?

注意:我不能改变线程的创建方式,我只能改变那些方法!!! (加上wait所在线程中的while循环)

最佳答案

如果你知道线程数,你可以使用 CyclicBarrier :

static final CyclicBarrier barrier = new CyclicBarrier(numberOfThreads);

然后,在您想让所有线程等待其他线程的那一刻,您调用:

barrier.await();

如果有一个线程还没有到达该行,调用await() 的线程将被阻塞。一旦所有线程都到达那里并调用 await(),它们将全部恢复。

每次一定要建立一些同步机制的时候,一定要检查包java.util.concurrent .那里有很多精彩的类(class),由专家创建。大多数时候你不需要自定义的东西,如果你需要,在同一个包中有一些类几乎不需要直接使用等待/通知——相信我,你想避免使用这些直接方法;如您所见,您很容易陷入僵局!

关于java - 执行线程 "one by one",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555269/

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