スレッドがアクセスできるシングルトンクラスがあります。
各スレッドはこのクラスのインスタンスをロードし、ループ内でこのクラスのメソッドを呼び出します。スレッドを1つずつ実行する
すべてのスレッドがメソッドを呼び出すことができるように、実行の流れを制御する必要があります。 スレッドは、メソッドを任意の順序で呼び出すことができます。スレッドは、ループを移動する前にメソッドを一度実行しなければなりません。スレッドで
::私はやってみました何
これを
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;
実行中、私はのsomeMethodに何をしたか
while (some condition){
ObjectType obj = theSingleton.getInstance().getSharedObject();
obj.SomeMethod(threadID);
if (obj.waitisneeded())
synchronized (obj) {
obj.wait();
}
}
これは私を未熟なものにした結果とデッドロック。
どうすれば修正できますか?
注:スレッドの作成方法を変更することはできません。これらのメソッドのみを変更できます。あなたはすべてのスレッドを作成したい時点で、その後
static final CyclicBarrier barrier = new CyclicBarrier(numberOfThreads);
:あなたがスレッドの数を知っていれば(プラス待ち時間があるスレッドでwhileループは)
(
rendezVousPoint
カウントが0になった)この状況で最後のスレッドがそれらのすべてを到着すると解除されるまで、すべてのスレッドが
await()
方法でブロックされます実行します。ここではは、あなたがこれを達成する方法でありますそれぞれが 'obj.SomeMethod()'を呼び出す前にいくつのスレッドが作成されているか知っていますか? –
"予想されるすべてのスレッドが現在シングルトンと呼ばれている"時点に達したことをどのように知っていますか? –
@TheScrumMeisterスクラムマイスターはい、私はスレッドの数を知っています – kenny