2016-09-08 5 views
-1

編集:これは本当に愚かですが、どうして私はそれが通常の増分がない通常のループであるかわかりません。私はこの質問を投稿したときに私が酔っていたことを願っています。とにかくみんなありがとう!保護されたブロック上のJava Oracleの例

できるだけ多くの情報と例を収集するために、Javaマルチスレッドに関するチュートリアルをいくつか続けます。

OracleのWebサイトにJava Concurrencyに関する公式のチュートリアルがあり、Guarded Blocksセクション(here)を見ています。

すべての概念は明確ですが、私はページ下部のプロデューサー/コンシューマーの例を読んでいますが、コードの一部を理解できません。

具体的には、次は、Consumerクラスのrun()メソッドのコードです。forループがどのように動作するのか分かりません。それは私に働くことができるように見えません。

誰でも私を説明できますか?

public void run() { 
     Random random = new Random(); 
     for (String message = drop.take(); 
      ! message.equals("DONE"); 
      message = drop.take()) { 
      System.out.format("MESSAGE RECEIVED: %s%n", message); 
      try { 
       Thread.sleep(random.nextInt(5000)); 
      } catch (InterruptedException e) {} 
     } 
    } 

答えて

0

ループは非慣用的な方法で使用されています。

int i = 0;の代わりにString message = drop.take();という初期化があります。

次に、i < 10の代わりに!message.equals("DONE");というテストがあります。

最後に、実際の用語である「増分」またはループ・アドバンスがあります。 (i++ではなく)で次の値を取得します。

0

多分whileループに変換する際に理解することが容易になるだろう:

for (INITIALIZATION; CONDITION; AFTERTHOUGHT) 
{ 
// Code for the for-loop's body goes here. 
} 

初期化が実行されます。

public void run() { 
    Random random = new Random(); 

    String message = drop.take() 
    while (!message.equals("DONE")) { 
     System.out.format("MESSAGE RECEIVED: %s%n", message); 
     try { 
      Thread.sleep(random.nextInt(5000)); 
     } catch (InterruptedException e) {} 
     message = drop.take() 
    } 
} 

forループは、一般的に3つの部分から構成されていることを覚えておいてください最初の反復の前に一度、各反復の前にCONDITIONがチェックされ、各反復の後にAFTERTHOUGHTが実行される。 (https://en.wikipedia.org/wiki/For_loop#Traditional_for-loopsから撮影)

したがって、この例では、forループの初期化は、メッセージ変数を作成し、ドロップから最初のメッセージをとります。次にCONDITIONブロックでチェックして、それが何かであるかどうかを確認します。DONE。そうであれば、ループ本体が1回実行され、メッセージが出力され、最大5000ミリ秒間スリープ状態になります。その後、AFTERTHOUGHT句で次のメッセージが取得され、ループはCONDITIONブロックを再度チェックして、次のメッセージを印刷するか、DONEを受け取った後にループを終了します。

関連する問題