Существует одноэлементный класс, к которому могут обращаться n потоков.
Каждый поток загружает экземпляр этого класса и вызывает метод из этого класса в цикле.
Я должен контролировать поток выполнения, чтобы каждый поток мог вызвать метод one и сделать паузу, только после того, как весь поток вызвал метод, как только он должен возобновить свою работу.Потоки могут вызывать метод в любом порядке, только все они должны выполнить метод один раз перед перемещением цикла.
Это то, что я пытался сделать:
В потоке:
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
}
и в waitisneeded:
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;
Выполнение этого принесло мне неожиданные результаты и тупики.
Как я могу это исправить?
Примечание: я не могу изменить способ создания потока, я могу изменить только эти методы !!!(плюс цикл while в потоке где ожидание)