2017-04-14 4 views
-1

は、このようなシナリオでブロックされたスレッドが起動することはできますか?

synchronized void methodA() throws Exception { 
    wait(); 
} 

synchronized void methodB() { 
    notify(): 
} 

スレッドB

//... work 
A.methodB(); // thread A was so far blocked by calling wait() 

スレッド、ブロックされたスレッドは、それ自体をスリープ解除することができますか?

+0

私はちょうど私かもしれないが、私は完全に質問を得ていない。あなたは[mcve]を投稿できますか? – CollinD

+1

スレッドAがスリープ状態にあり、スレッドBがスレッドAをウェイクアップしている場合、スレッドが自己スリープ解除できるかどうかを確認するのはなぜか分かりません。ところで、答えはいいえです。 – alfasin

+1

@CollinD - 問題は、この質問に対してMCVEが使用できないということです。 OPが(面白く)しようとしていることは、Javaや他の命令的プログラミング言語では表現できません。 (私はPLを全く言わないことを躊躇している。おそらくこれを持つ計算モデルが可能であろうし、そのモデルはおそらく量子プロセッサで実装可能かもしれないからだ。) –

答えて

4

ブロックされたスレッドが起きる可能性はありますか?

いいえ。

wait()(または他のブロッキング呼び出し)でブロックされたスレッドは、ブロックが解除されるまでコードを実行できません。

何かをするなど... notify() ...を呼び出しても、スレッドは既にブロック解除されている必要があります。


デザインに正確にこれが必要な場合は、実装できません。ここには2つのアイデアがあります...あなたが求めているものはまったくありませんが。

  1. 代わりにwait()を使用してください。例えばwait(millis)。これは通知を待つか(別のスレッドから)、またはmillisミリ秒が経過するまでのいずれか早い方が起きます。

  2. 第2のスレッドをnotify()に最初のスレッドを使用してください。

関連する問題