私はJavaを読み始めており、マルチスレッドのトピックに取り組んでいます。また、私はCプログラマーなので、C言語のスレッド化に関する知識があります。
特定のオブジェクト上でスレッドが互いに通信する方法を探していました。
私はこの質問を見つけた Java:スレッドではないオブジェクトでwait()およびnotify()メソッドを呼び出すにはどうすればよいですか? しかし、私は矛盾しています。
私が知っていること synchronized
キーワードは、ロックメカニズムの概念を適用します。オブジェクトを同期してから呼び出した場合 wait
このオブジェクトでは、別のスレッドがアクセスするためにロックが解放されることを意味しますか?前のリンクの例として
回答:
回答№1の場合は3あなたは「Cのスレッド化に精通している」と言います。
暗黙のことを想像することでJavaの動作を理解できます p_thread_mutex_t
変数と暗黙的 pthread_cond_t
すべてのJavaオブジェクトに関連付けられた変数。
オブジェクトがあるとします foo。使用しましょう m(foo) 想像されるミューテックスを示すために、使用しましょう c(foo) 想定される条件変数を示します。
A synchronized(foo) { ... }
ブロックロックはこれとほとんど同じです:
pthread_mutex_lock(m(foo));
...
pthread_mutex_unlock(m(foo));
唯一の違いは、mutexのロックを解除せずに同期ブロックから抜け出す方法がないことをJavaが保証することです。たとえ ...
例外をスローすると、ミューテックスはまだロック解除されます。
だから、あなたの質問への答え:
への呼び出し foo.wait()
基本的にに翻訳する pthread_cond_wait(c(foo), m(foo));
回答№2については2
wait()が呼び出されると、同期オブジェクトのロックが解除されます。以下のOracleドキュメントからの抜粋を参照してください。 「モニター」という言葉は「ロック」と同じ意味です
」 public final void wait() 投げるInterruptedException 別のスレッドがこのオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。つまり、このメソッドは、wait(0)の呼び出しを実行するだけのように動作します。 現在のスレッドは、このオブジェクトのモニターを所有している必要があります。 スレッドはこのモニターの所有権を解放します 別のスレッドがスレッドに通知するまで待機しますこのオブジェクトのモニターを待機して、notifyメソッドまたはnotifyAllメソッドのいずれかの呼び出しによってウェイクアップします。スレッドは、モニターの所有権を再取得して実行を再開できるまで待機します。
引数が1つのバージョンと同様に、割り込みとスプリアスウェイクアップが可能です。このメソッドは常にループで使用する必要があります。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
このメソッドは、このオブジェクトのモニターの所有者であるスレッドによってのみ呼び出される必要があります。スレッドがモニターの所有者になる方法の説明については、notifyメソッドを参照してください。
"
回答№3の場合は1
一般的な規則は次のとおりです。
スレッドは呼び出すことができます
wait()
またはnotify()
ロックを取得したときsynchronized
2つのスレッドは内部でコードを実行できません
synchronized
同時にブロックします。他のスレッドは、ロックを取得するまで待機する必要があります。ロックを取得するスレッドが呼び出された場合
wait()
、ロックを自動的に解放します。それがされたときnotify()
ed、それは自動的にロックを再度取得しようとします。
回答№4の場合は-1
キュービホールの「プロデューサー/コンシューマー」の例をご覧ください。
http://www.tutorialspoint.com/javaexamples/thread_procon.htm