public class MyClass {
private List<Integer> resources = new ArrayList<>();
public synchronized Integer getAndRemoveResourceOrWait(Integer requestedResource) throws InterruptedException {
while(resources.stream().anyMatch((r) -> { return r >= requestedResource; })) {
wait();
}
Integer found = resources.stream().findFirst((r) -> {
return r >= requestedResource;
}).get();
resources.remove(found);
return found;
}
public void addResource(Integer resource) {
resources.add(resource);
notifyAll();
}
}
スレッド「A」は、乱数を使用してコードを追加します。 いくつかのスレッドが積極的にgetAndRemoveResourceOrWaitを呼び出します。コレクションから要素を同時に検索して削除するか、または待機します。
メソッドgetAndRemoveResourceOrWaitを同時に実行させるにはどうすればよいですか?
たとえば、スレッド「X」は、リソースコレクションに存在しない変数128を使用してgetAndRemoveResourceOrWaitを呼び出します。だから、それはそれを待っている。待っている間、スレッド "Y"は変数64でgetAndRemoveResourceOrWaitを呼び出し、リソース・コレクション内に存在します。スレッド「Y」は、スレッド「X」が完了するのを待つべきではありません。