私は同じ質問の別のボードを記入しようとしていませんが、私は約15の解決策を読んでおり、誰も全く同じ問題を抱えていません。同期スレッドがお互いをブロックしていない
private AgentModel agent;
private UserModel user;
private int type;
public AgentThread(AgentModel agent, UserModel user, int type) {
this.agent = agent;
this.user = user;
this.type = type;
}
public void start() throws InterruptedException {
agent.setT(new Thread(this, agent.getID()));
agent.getT().start();
}
、道下り少し:
public void run() {
while (!agent.getT().isInterrupted()) {
agent.nextOP();
try {
if (agent.getOPS() > 0) {
agent.getT().sleep((long) (1000/agent.getOPS()));
} else {
agent.getT().sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
agent.getT().interrupt();
}
synchronized (user) {
agent.setState(agent.getT().getState().toString());
// System.out.println("Operations Completed: " +
// (1+agent.getOPCompleted()));
if (type == 3) {
user.deposit(agent.getAmount(), Integer.valueOf(agent.getID()));
}
if (type == 4) {
user.withdraw(agent.getAmount(), Integer.valueOf(agent.getID()));
}
}
}
}
エージェントオブジェクトは、メソッドを開始AgentThreadに開始されたスレッドが含まれていますここで私が見ていたコードです。 AgentThreadオブジェクトは、エージェント、ユーザー、それぞれのクラスのインスタンスの両方を取り込みます。
私の問題は次のとおりです。ロックをUserModelクラス 'user'のインスタンスに設定します。スレッドは、エージェントの種類によっては入金または払い戻しを行うものとします。
agent.getT().getState()
を実行すると、作成したAgentThreadのインスタンス数に関係なく、常にRUNNABLEが返されます。各AgentThreadには新しいエージェントと新しいスレッドが与えられますが、同じUserオブジェクトが与えられます。あたかもスレッドが互いにブロックしていないかのようです。
リスナーで検出された変更を出力でき、実行中のすべてのスレッドとそのユーザーインスタンスとのやりとりを反映しているため、同じユーザーインスタンスに影響を与えていることは知っています。
スレッドが開始されるたびに、スレッドは「無限ループ」に入り、ユーザーインスタンスには入金または出金が行われます。これらのアクションは、x秒ごとに実行されます。
私たちには表示されていないコードがたくさんありますが、好奇心のために、そのスレッドが同期化されたブロックをどれだけ過ごすことが予想されますか?これはほんの数マイクロ秒です。 「AgentThreadを何回作成しても、どれくらいのインスタンスが作成されていますか?どのくらいの頻度で 'synchronized'ブロックに入っていますか?そして、あなたのプログラムはスレッドの状態をどのくらい頻繁に要求しますか?私が実際にここで得ようとしていることは、あなたがそれに気付く可能性があるロックのために非常に多くの競合があると思わなければならない理由は何でしょうか? –
@james large私は一度に4つのインスタンスを実行していましたが、すべてブロックをかなり早く入力し、プログラムはスレッドごとにブロックごとに状態を問い合わせます – BKreger
@mastovスレッドが状態をチェックしていないとブロックされた場合、 – BKreger