2

スレッドは、ブロック操作であるリソースを開きます。成功した場合、スレッドは再びスレッドを閉じる必要があります。これは再びブロックされますが、常に有限時間で成功します。

hasResourceスレッドが中断されたくないことを示すために、他のスレッドと同期できないフラグ ( と呼びましょう) を使用することができます。他の同期はまったく許可されません。

このシナリオを処理するための安全な方法は次のとおりですか?

@Override // we're subclassing Thread
public void run () {
    try {
        while (!interrupted ()) {
            blockingOpen ();
            // glitch possibility in this line
            hasResource = true;
            blockingClose ();
            hasResource = false;
        }
    }
    catch (final InterruptedException e) {
        interrupt ();
    }
}

特に、これにより、スレッドがリソースを持っている間にスレッドが中断されないことが保証されますか?

私が知る限り、エラーが発生する可能性があるウィンドウは 1 つだけです。それは、Open の直後で、フラグを設定する前です。ただし、これはリソースのリークにはつながらないようですが、割り込み要求を誤って無視することにはなりません。それを防ぐことは可能ですか?

4

2 に答える 2

1

実際、元のコードは正しいです。bool フラグを設定することは問題ではありませんが、質問が誤って可能性があることを示唆しています。これを明確にするために考慮すべき点が 2 つあります。

まず、行自体がエラーを引き起こすことはありません。Open が成功した場合、フラグ設定されます - 常に。ここでは、StackOverflow または OutOfMemory でさえ合理的に発生することはありません。

次に、interrupt()割り込み可能なコード (スリープなど) が実行されていないときに が呼び出されると、interruptedフラグが設定されます。次に割り込み可能なコードの実行が開始されると、このフラグがチェックされ、コードを実行する代わりに、割り込み例外がスローされます。

したがって、元のコードは実際に意図したとおりに機能します。

于 2017-08-14T22:59:08.507 に答える
0

他のスレッドと同期できないフラグ (hasResource と呼びましょう) を使用して、スレッドが中断されたくないことを示すことができます。他の同期はまったく許可されません。

いいえ、そうではありません。

これにより、スレッドがリソースを持っている間にスレッドが中断されないことが保証されますか?

いいえ。がであり、他のすべてのスレッドがそれを認識して監視している場合 は、 を呼び出すことを自分で禁止していますが、 Javaがそうするのを禁止していません。hasResourcevolatile hasResource Thread.interrupt()

アプリケーション スレッドが互いに割り込む理由は別の問題です。この機能を 20 年間使用したことはありません。

于 2017-08-14T23:26:10.413 に答える