2011-09-14 4 views
2

私はJavaを使用してプロジェクトを作成しました。後続のプロセスにデータを注入する複数のスレッド

私は複雑な処理をしています.1つのプロセスから10個の異なるスレッドを作成して、他のスレッドが処理を完了するのを待ちます。これで、作成されたスレッドはデータベース処理を行い、最後に出力を生成します。しかし、ここでの問題は、待機していたプロセスが、作成されたスレッドで作成されたすべてのデータを処理する必要があるということです。

私はほとんど何が行われる必要が無知です。

よろしく

答えて

3

java.util.concurrent.ConcurrentLinkedQueueを使用できます。完了したら、各スレッドが結果をキューに入れるようにします。メインスレッドは待ち行列を監視し、入ってくるときに結果を処理します。

また、Futuresを使用することもできます。スレッドの代わりに、各プロセスにFuturesを使用するだけです。メインスレッドは、各未来が処理を終了するのを待つ間にブロックされます。

+0

この場合、メインプロセスは他のスレッドが完了したことをどのように知るのですか? –

+0

キューを見ている場合は、どれだけ多くのことが予想されているのか、キューに何らかの種類のマーカーを入れて完了したことを知らなければなりません。 – mamboking

+1

先物の場合、future.get()を呼び出すだけで、スレッドが結果を配信するまで待機します。 – mamboking

0

あなたのメインスレッドで10個のスレッドを開始し、それらが終了するのを待つ必要があります。これは、開始された10個のスレッドのそれぞれ(これらはすべて開始された後)でThread.join()を呼び出すことで実行できます。

スレッドの詳細については、the Java tutorial about concurrencyを参照してください。

1

BlockingQueueを使用して、すべてのデータを1つのデータ構造に集約することを検討することがあります。

このキューは、すべてのスレッドが実際に作業を終了する前でも、メインプロセスで使用できます。

0

子スレッドが作業を完了するまでメインスレッドで待機する方法が難しい場合は、childThread.join()をメインスレッドの子スレッドに使用できます。子スレッドによってもたらされる結果をdb availbleからメインスレッドに処理させる方法に悩まされている場合は、子スレッドによって作成され、メインスレッドによってアクセスされる共有データ構造を使用します。 (正しく同期されていることを確認してください)

ただし、このようなすべてのタスクでは、Java 1.6ではExecutorフレームワークを使用することをお勧めします。

0

共有オブジェクトを使用してデータを追加するだけで済みます。

私は右クリックを理解している場合:

は(たとえばのMyDataのために)最終的にすべてのデータを保持するクラスを作成します。このクラスは、データを返す "getData"メソッドと、選択したコレクション(配列、リストなど)にデータを追加する "add"メソッドを持つことができます。その後

スレッドは、それが呼び出したデータを処理して行われます。

MyData.add(partialDataFromThread) 

そして、あなたの主なクラスが行います最終的には:

MainClass.process(MyData.getDatA()); 

はそれが役に立てば幸い...

0

java.util.concurrentを使用できます。CompletionServiceを実行してタスクの完了を確認し、ポーリングします。

また、CountdownLatchクラスまたはCyclicBarrierクラスを調べてください。

インターネットがすでにそのような例であふれていると仮定しているので、例が必要な場合はお知らせください。また、javadocsはかなり良いですし、それは最初にそれを行うには常に良い学習曲線です。

関連する問題