2016-08-02 3 views
1

ThreadAという新しいスレッドを作成し、メインスレッドで開始しました。通知後に待機中のスレッドに制御が戻らない

ThreadAでいくつかの操作が完了するのを待っていました。

一部の操作の後、notifyを使用して通知を送信しました。

メインスレッドのwait以下のコードは呼び出されず、ThreadAのコード全体が完了するのを待ちます。

問題を実行するにはスレッド化の性質やスレッドにアクセスできますか?

ここ
Job job = new MyJob(); 
job.schedule(); 
synchronized(job) { 
    job.wait(); 
    sysout("After notify"); 
} 

jobですorg.eclipse.core.runtime.jobs

インサイドジョブ実行方法:

run { 
    synchronized(this) { 
     step 1(); 
     notify(); 
     step 2(); 
    } 
} 

ここでステップ2は、大きなコードです。

+2

コードを表示してください(どのくらい正確に 'wait'と' notify'を呼び出していますか)。 – yole

+0

ジョブジョブ=新しいMyJob(); job.schedule();同期(ジョブ){job.wait(); sysout( "After notify")} jobはorg.eclipse.core.runtime.jobsです。 – user3302323

+0

内部ジョブ実行方法:run {synchronized(this){ステップ1(); notify();ステップ2();}}ステップ2は大きなコードです。 – user3302323

答えて

1

通知スレッドは、ロックを解除するまで実際に通知を送信しません。通知が行われる前にロックを解除する必要があります。コードでは通知が行われません。

通知を受信したスレッドにはロックがありません。スレッドが待機している場合は、ロックを取得してからwaitメソッドを終了する必要があります。通知されたスレッドは優先されず、次に最初に行動する必要があると考える理由はありません。

これは、あなたがやっていないループで常にwaitを呼び出すことをお勧めしている理由の一部です。覚醒していたスレッドは、ロックを取得した後も、それが起きた状態がまだ真であるかどうかをチェックする必要があります。

ジョブの実行方法は、step1を呼び出すときからstep2を呼び出すまでの間、すべてロックされます。通知されたスレッドが通知に関する何かを行うためには、waitメソッドを終了する前にロックを再取得する必要があります(同期ブロックを入力する必要があるため)。これは、通知スレッドがロックを解放する前に、通知を送信するポイントがないことを意味します。なぜなら、待っているスレッドが何らかの方法でそれを行うことができるからです。

+0

同期(ジョブ)がそのオブジェクトのロックを取得していますか? – user3302323

+0

@ user3302323 'synchronize'キーワードは、同時に1つのスレッドだけが入力できるブロックをマークします。他のスレッドが現在同じオブジェクトの同期ブロックにある場合、他のスレッドが同期ブロックを終了するまで実行が一時停止されます –

+0

オブジェクトのロックを解除して取得する方法を詳しく説明できますか? – user3302323

関連する問題