2016-08-20 11 views
0

これは簡単な質問ですが、それでも私はそれを自分で取得しません。言って、私は次のコードを持っています。 doSomething()は、スレッドの前に行く理由同期メソッドを呼び出す順

Runnable objectRunnable = new Runnable() { 
    void run() { 
      synchronized(object) { 
       for (int i = 0; i < 5; i++) { 
        System.out.println("it's runnable"); 
        Thread.sleep(100); 
       } 
      } 
    } 
}; 

void doSomething() { 
    synchronized(object) { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("it's doSomething"); 
      Thread.sleep(100); 
     } 
    } 
} 

synchronized (object) { 
    new Thread(objectRunnable).start(); 
} 
object.doSomething(); 

ので、出力は

it's doSomething 
it's doSomething 
it's doSomething 
it's doSomething 
it's doSomething 
it's runnable 
it's runnable 
it's runnable 
it's runnable 
it's runnable 

質問のようなものはありますか?さらに、シンクロブロックの後にオブジェクトメソッドを複数回呼び出すと、それらはすべて後で呼び出され、プログラムはスレッドの内容に戻ります。私は同期スレッド内のスレッドを呼び出すスレッドを、たとえば、何かアナログオブジェクトメソッドを呼び出すと置き換えると、すべてがOKであり、指定された順番になります。

同期オブジェクトのメソッド自体は、このオブジェクトで同期されたスレッドの前にある種の優先順位を持っていますか?

+0

このコードは、残念ながらコンパイルされません。 – tkausl

答えて

1

あなたがここにいるのは競合状態です。起動時に起動時に実行時に実行待ちがブロックされ、作成時にsynchronized (object)が発生します。スレッドを作成するスレッドがモニタを解放すると、runnableを持つ新しく作成されたスレッドは、同じスレッドがdoSomething()メソッドで再び同じスレッドを再入力するため、それをつかむ機会はありません。

あなたはobject.doSomething()

synchronized (object) { 
    new Thread(objectRunnable).start(); 
} 
Thread.sleep(100); // <<== Add this line 
object.doSomething(); 

プリントアウトの順序が逆になります(demo)を呼び出す前にThread.sleep(100);への呼び出しを追加する場合。

it's runnable 
it's runnable 
it's runnable 
it's runnable 
it's runnable 
it's doSomething 
it's doSomething 
it's doSomething 
it's doSomething 
it's doSomething 
+0

それは少し物事をクリアしますが、それでもまだ、runnablesの同期化された作成の後、スレッドは次に呼び出されません?コード内のこのスレッドで 'start()'を呼び出し、 'doSomething()'の前に行くので、それらは呼び出されたメソッドのスタックの最上部のように置かれ、現在のスレッドそれらの前にグラブモニタ – idementia

+0

@idementiaスレッドは次に開始されますが、親スレッドがまだロックを保持しているのですぐにブロックされます。親スレッドがロックを解放すると、それはグラブになりますが、同じスレッドは、既に実行中であるため、他のスレッドはブロックされているため、それを取得するには近づきます。 – dasblinkenlight

2

メインスレッドはロックを取得するための最初のスレッドです。スレッドが実際に実行を開始するには、start()を呼び出してから時間がかかるため、生成されたスレッドであった可能性があります。

質問の残りの部分については、あまりにもあまりにも漠然と答えられません。

関連する問題