0

できるだけ早く変更する必要がある次のシナリオがあります
。 1. 順次スレッドのグループが実行されます (3 つのスレッドが含まれます)
2. 別の順次スレッドのグループが実行されます (2 つのスレッドが含まれます)
3. 並列スレッドのグループが実行されます(スレッドの生産者と消費者のアプローチが正しく適用されるように、9 つのスレッドが含まれています)

このシナリオを作成した理由

最初に特定のスレッドを実行するには (ポイント 1: 3 つのスレッドを含む)、それらの処理が完了したら、別の 2 つのスレッドを実行する必要がありました (ポイント 2: 2 つのスレッドを含む)。ポイント 1 とポイント 2 がカバーされている場合にのみ、ポイント 3 を処理する必要がありました。

最初は、並列操作を処理するためにすべてのスレッドを実行する必要がありましたが、並列スレッドが同時に実行されるため、その考えはそのままにしました。

上記の状況では、何らかの問題が発生するまで、すべてがスムーズに機能しています。

上記のシナリオを変更する必要があるのはなぜですか?

並列スレッドの場合に適切に処理できる例外が発生することがあります。シーケンシャルスレッドに入ると同じ例外が発生し、処理できなくなります。そのため、シーケンシャル スレッドの他のすべての処理は、最初のスレッドが完了するまで待機状態になります。


そのため、並列スレッドの利点を活用する必要がありますが、簡単にするためにこの方法を選択したため、アプリケーションの状況を処理するのが難しくなりました。
そのため、一定の順序で異なる並列スレッドを実行するシナリオを作成する必要があります。例えば:

Order-1st = 最初の 3 つの並列スレッド
を処理 Order-2nd = 次の 2 つの並列スレッド
を処理 Order-3rd = 次の 9 つの並列スレッドを処理

また、上記のケースは多少制限されていますが、これには一般的な解決策が必要です。将来、Order-1 からさらに 2 つのスレッドを追加したい場合や、任意の注文のスレッドをいくつか削除した場合でも、グループのシーケンスは必要に応じて実行されるはずです。
指定した順序で実行できるように、並列スレッドのグループを作成できる Java の方法はありますか?

編集
変更を手伝っていただければ、次のコード スニペットがあります。

// レベル1

Thread[] threads = new Thread[list1.size()];
int j=0;
for(list1.size()){
    Object delegator1 = new Object("Level-1");
    Thread th = new Thread(delegator1);
    threads[j]=th;
    th.start();

    j++;
}
for(Thread thread: threads){
    thread.join();
}

// レベル2

threads = new Thread[list2.size()];
j=0;
for(list2.size()){
    Object delegator2 = new Object("Level-2");
    Thread th = new Thread(delegator2);
    threads[j]=th;
    th.start();

    j++;
}
for(Thread thread: threads){
    thread.join();
}

// レベル 3 & 4 --> 正常に動作する wait-notify を使用して適用された Producer-Consumer。

for(list3.size()){
    Object delegator3 = new Object("Level-3 & 4")
    Thread th = new Thread(delegator3);
    th.start();
}

これらの異なるレベルを並行して実行したいのですが、最初のレベルが終了した場合、その後 2 番目のレベルを実行する必要があります。

4

2 に答える 2

1

Order-Instances にいくつかの状態があるようです。状態は、 Order-1Order-2Order-3、およびFailedです。

Producer-Consumer-Queues を使用して、これらの状態を実装できます (またはすべてに対して 1 つのキューを実装することもできます)。操作の結果に応じて、インスタンスは必要なスレッド数だけ処理される「次の」キューに移動されます。

単一のキューを使用する場合、それを処理する可能な方法は、次のような計算を含む Envelope-Object である可能性があります

class Order1Processor implements Runnable {
     Object delegate;
     Order1Processor(Object delegate) { this.delegate = delegate; }
     public void run() { 
       try {
          // do the Order-1st processing
          doSomethingWith(delegate);
          // submit to next free Thread for Order-2nd processing
          submitToQueue(new Order2Processor(delegate));
       } catch (Throwable t) {
          // signal/handle failure
          submitToQueue(new FailedProcessor(delegate, t))
       }
 }


}  
class Order2Processor .. 

注文を処理するために必要な数のスレッドを使用できるようになりました。単一のキューを使用すると、現在実行中の作業に応じて、必要な数のリソースを自動的に割り当てることができます。以前または特定の順序で処理する必要がある注文または操作がある場合は、PriorityQueue を使用することもできます。

于 2013-02-26T07:56:15.137 に答える