0

このコードブロックはどのように機能しますか:

boolean flag=true;
while(flag){
    wait();
    flag=!flag;
}

flag = !flag は実行されますか? さらに、フラグを静的変数 (インスタンス間で共有) として設定し、次のコードを含む 2 つのスレッドを開始する場合:

for(int i=0;i<5;i++){
 flag=!flag;   
 while(flag){
        System.out.println("*");
        wait();
    } 
    notify();
}

乱数の '*' を出力した後にプログラムが停止するのはなぜですか? (同期を使用した後でも)。while ループ内での wait() の動作を説明してください。

4

3 に答える 3

1

.wait() は次のように述べています。誰かが notify() を呼び出すまで、別のタイムスライスを渡さないでください。」OS は、誰かが notify() を呼び出さない限り (または他のいくつかのウェイクアップ シナリオのいずれかが発生しない限り)、タスクのスケジュールを試みません。

flag = !flag は実行されますか?

はい、スレッドが起動された後です。

さらに、フラグを静的変数として設定し、次のコードを含む 2 つのスレッドを開始するとします。

フラグが静的であるということは、インスタンス間で共有されているということですよね?

フラグが true で始まると仮定します。

  • 1 つのスレッド A を生成します。
  • もう一方のスレッド B を生成します。スレッドは、ランダムな遅延の後に実行を開始します。
  • A はフラグを false から true に設定します。A はループの実行を開始します。A は再び目覚めるまで待ちます。
  • ある時点で B が実行を開始します。その場合、フラグを false に設定します。Bはnotify()に直行します。それが通知する唯一のものはそれ自体です。
  • A は notify() を待ち続け、B は終了しました。
  • A がある時点で通知された場合、A はループを続行し、フラグが true ではないことを確認して続行し、終了します。
于 2013-11-08T17:08:08.417 に答える
0

完全な実装は次のとおりです。

class Test implements Runnable{
    static boolean flag=false;
    public static void main(String[] args){
        new Thread(this,"thread1").start();
        new Thread(this,"thread2").start();
    }
    public void run(){
        for(int i=0;i<5;i++){
            flag=!flag;
             try{
                while(flag){
                System.out.println("*");
                wait();
                }
            }catch(InterruptedException e){
                System.out.println("thread interrupted");
            }
            notify();
        }
    }
}

while(flag) ステートメントを if(flag) ステートメントに置き換えると、完全に正常に機能します。while を使用すると、完全な出力の一部を出力した後に停止します。

于 2013-11-08T17:56:32.937 に答える