0

現在、プログラムに更新チェック モジュールを追加しようとしています。メソッドは、更新情報の Web サイトを処理しています。しかし、状況によっては Web サイトにアクセスできず、プログラムは 0.5 秒でチェックを停止します。これを可能にするために、次のコードを書きました。

int[] lock = new int[0];
boolean fileListGot = false;

Thread downloadFile = new Thread() {
    public void run() {
        synchronized (lock) {
            fileList = HttpFetcher.fetch("http://*****/****");
            fileListGot = true;
            lock.notify();
        }
    }
};

synchronized (lock) {
    downloadFile.start();
    lock.wait(500);
}

return fileListGot;

しかし、プログラムは 0.5 秒経っても停止しません。プログラムのどこが悪いのですか?Object.wait(long) の使い方は?

4

2 に答える 2

1

Object.notify javadocsを読んでください- 重要な部分は、「現在のスレッドがこのオブジェクトのロックを放棄するまで、目覚めたスレッドは続行できません。」

メインスレッドは のモニターを取得しlockます。ワーカー スレッドを開始します。ワーカー スレッドはlockのモニターを取得しようとしますが、取得できません。その後、メイン スレッドが呼び出さlock.wait(500)れるため、モニターが失われます。次に、ワーカー スレッドがモニターを取得して続行します。ダウンロードが 500 ミリ秒後も進行中の場合、wait が返され、メイン スレッドがモニターを獲得しようとしますが、ワーカー スレッドがまだ所有されています。

ファイルをダウンロードするときにモニターを保持する必要はありません。共有変数を変更する場合にのみ使用してください。代わりにこれを試してください。

public void run() {
    T temp = HttpFetcher.fetch("http://*****/****");
    synchronized (lock) {
        fileList = temp;
        fileListGot = true;
        lock.notify();
    }
}

ここで、T は fileList の適切なタイプです

于 2013-09-29T14:16:32.090 に答える