6

JavaでRunnableを実装するクラスを持つことが可能かどうか、そしてクラスのオブジェクトがwait()に行く場合(つまり、スレッドがシグナルを受信するまで実行を停止する場合)、同じクラスの別のオブジェクトがそれに通知できますか?実行を継続しますか?

理想的には、私がやりたいことは次のとおりです。

public class ThreadClass implements Runnable{

 public void run(){
 //.. Does some arbitrary work

  if( aCondition){  //have it wait until something signals it to contine exection.
 this.wait();
 }

 //Continues to do more work.

 //finished whatever it needed to do. Signal all other threads of this object type to continue their work.
 this.notifyAll();

 }
}

これは可能ですか?もしそうなら、どうやってそれをやろうと思いますか?オブジェクト自体がそれ自体と同じタイプの他のすべてのオブジェクトを管理できるようにしようとしています。そのため、このクラスを使用する人は、このクラスの管理について心配する必要はありません。

4

4 に答える 4

6

オブジェクト自体がそれ自体と同じタイプの他のすべてのオブジェクトを管理できるようにしようとしています。これにより、このクラスを使用する誰もが管理について心配する必要がなくなります。

すべてのインスタンスに他のすべてのインスタンスを認識させたい場合は、ある種の静的コレクションが必要になります...これにより、ガベージ コレクションがトリッキーになり、テストがすべて難しくなります。

このクラスのインスタンスを管理することが唯一の仕事である別のマネージャータイプを用意することをお勧めします。その場合でも、ロジックを 1 か所に配置するだけで済みますが、型のすべてのインスタンスについて知る必要はありません。マネージャーは、何を管理しているのかを知る必要があるだけです。クライアント コードがマネージャのみを参照する必要があり、個々のインスタンスが非表示になるように API を作成することもできます。

編集: 明確にするために、wait/notifyAllはまったく必要ないかもしれませjava.util.concurrentwait。この回答は、オブジェクトが他のどのオブジェクトと通信する必要があるかをオブジェクトに知らせるという、より高いレベルの質問に対処しています。あるタイプのすべてのオブジェクトが別のタイプを知っているという質問の考えは問題につながるため、マネージャークラスの提案です。

于 2012-10-21T06:37:35.687 に答える
1

あなたは尋ねました

同じクラスの別のオブジェクトが実行を継続するように通知できますか?

はいぜったいに!-オブジェクトがブロックされ、このオブジェクトを待機している場合、任意のクラスの任意のインスタンスからnotifyAllを呼び出すと、オブジェクト実行が許可されます。(Runnableがそれ自体を待機していることを含む)

notifyAllは、通知するクラスのタイプを気にせず、このオブジェクトを待機しているすべてのクラスに通知します。(ロックとして使用)。

さらに言えば、任意のクラスの任意のインスタンスは、任意のオブジェクトで待機または通知のいずれかを呼び出すことができます。待機と通知はjava.lang.Objectのパブリックメソッドです

待機中はこのチュートリアルを参照してください。通知してください。

http://www.java-samples.com/showtutorial.php?tutorialid=306

于 2012-10-21T07:10:14.733 に答える
1
If( condition)
{ wait }

理想的には、wait は if ブロックではなく while 条件で囲む必要があります。クライアントは、通知のみに依存するのではなく、先に進む前に条件が満たされていることを確認する必要があるためです。

于 2012-10-21T06:46:18.177 に答える