4

LockSupport が JDK の一部であることは知っていますが、以下の実装が意味的に正しいかどうか疑問に思っています。Object.wait がスレッドの割り込みの問題を処理できることを確認してください。私の質問はパフォーマンスに関するものではありません。ただし、ソリューションが待機、通知、同期などの基本的な構造のみを使用している限り、ソリューションを改善するための提案をいただければ幸いです。

どうもありがとう。

final class LockSupport {
    static void park(long time) {
        Thread th = Thread.currentThread();
        if (th instanceof MyThread) {
            MyThread h = (MyThread)th;
            synchronized (h.obj) {
                if (h.permit) {
                    h.permit = false;
                    return;
                }
                try {
                    h.obj.wait(time);
                } catch (InterruptedException e) { }
            }
        }
    }

    static void unpark(MyThread h) {
        synchronized (h.obj) {
            h.permit = true;
            h.obj.notify();
        }
    }
}

abstract class MyThread extends Thread {
    public Object obj = new Object();
    public boolean permit = true;
}
4

1 に答える 1

2

最初の許可は偽でなければなりません。

割り込みがキャッチされたら、現在のスレッドを再割り込みする必要があります

 catch (InterruptedException e) { th.interrupt(); }

割り込みが原因で戻った場合park()は、割り込みステータスを設定する必要があるためです(javadocの例を参照)。

完了後wait()、通常または中断により突然、許可証を消費します。

unpark()、許可がすでに真である場合、通知する必要はありません。

于 2013-02-27T23:13:31.827 に答える