1

Party、Creature、Job、Item の 4 つのクラスがあるとします。

パーティにはクリーチャーがいる
パーティにはアイテムがある
クリーチャーにはジョブ(スレッド)がある
ジョブにはアイテムが必要

どのジョブもアイテムに同時にアクセスできないように、個々のアイテムを同期する方法を決定するのに苦労しています。パーティーで利用可能なすべてのアイテムのリストをフォームにまとめました

ArrayList<ItemInstance>

ここで、ItemInstance には Item と数量を示す整数があります。このリストでロックを実行する方法がわかりません

ReentrantLock resourceLock = new ReentrantLock();
ArrayList<Condition> resourceConditions = new ArrayList<Condition>();

そうしようと思ったのですが、resourceLock をロックするとすべての Item がロックされてしまいますよね?また、特定の量のアイテムをロックする必要があります。だから私の配列エントリは

(Swords, 4)

私のマスターリストにはありますが、私の仕事には3本の剣しか必要ないかもしれません. それらをすべて単一の列に保存して、数量を削除する必要がありますか?

一般的なコンセプトは、すべてのアイテムと数量を含む 1 つの大きなパーティー リストを作成し、必要なアイテムと数量の小さなリストを含む多数のジョブを作成するというものです。Jobs スレッドにすべてのアイテムを十分に待機させ、実行してから、アイテムを解放して再利用しようとしています。

PartyList = 
(Swords, 7)
(Forks, 2)
(Bottles, 5)

JobEatList = 
(Forks, 1)
//RUN THREAD

PartyList = 
(Swords, 7)
(Forks, 1)
(Bottles, 5)

JobDineList = 
(Bottles, 2)
(Forks, 4)
//WAIT
4

2 に答える 2

1

実行したい並行操作 (クラスのメソッド) のリストを作成する必要があります。それらの依存関係と不変条件を概説して、同時に実行できることとシリアル化 (同期) する必要があることを理解します。ジョブをほぼ独立したタスクとして定義して、最小限のブロックで最大の同時実行性を実現します。java.util.concurrent提供するもの、特に などの高レベルのクラスをよく見てくださいSemaphore

これが広範で一般的すぎるように聞こえる場合は申し訳ありません。

于 2013-03-11T22:28:25.507 に答える
0

まず、他の人が指摘しているように、あなたは自分がやろうとしていることを少し明確にしたり、分析したりする必要があります。

次に、「プログラマーにとって簡単」なアプローチの1つは、CopyOnWriteArrayList「トリッキー」なものすべてにsを使用することです。速度の点では最も効率的ではないかもしれませんが、アプリケーションには十分な速度である可能性があります。少なくとも考えてみてください。

于 2013-03-11T22:36:20.630 に答える