3

Fooクラスを使用する次のクラスがありますFooProcessor。だから私がやりたいのは、cp1インスタンスプロセスメソッドを実行しながら、並行して実行したいcp2.process().

public class Foo {

    public static void main(String [] args){

        FooProcessor cp1 = new FooProcessor();
        FooProcessor cp2 = new FooProcessor();

        cp1.process();
        // in parallel process cp2.process();
    }

}

public class FooProcessor {
    public void process(){
        System.out.println("Processing..");
    }
}

ただし、cp1 を順次実行したいので、実行して完了させたいのですが、cp2 が完了しないか失敗しても問題ありません。失敗しない場合は、結果に参加したいと思います。このサンプルでは何も返されていませんが、結果を返したいです。

この目的のために、TaskExecutor を使用する必要がありますか? またはスレッド?

cp1 と並行して cp2 だけを実行したい。または、さらに追加する場合は、cp3 と言って、それを cp1 と並行して実行したいと考えています。

4

5 に答える 5

5

要約すると、私がそれを実装する方法:

  • たとえば、 ExecutorServiceを介してさまざまなプロセスを実行しますExecutorService executor = Executors.newFixedThreadPool(nThreads);
  • すべてのタスクのFutureを List に保存します (ExecutorService#submit によって返されます)
  • future1.get()完了するのを待ちfuture1ます。cp1 にリンクされた未来はどこにありますか
  • 返されたらget(cp1 が終了したら) 、他のすべての先物をキャンセルshutdownNowします (または、executor が不要になった場合は executor サービスをキャンセルします)。
  • そのキャンセル プロセスを機能させるには、cp2、cp3 などで、実行中の操作をできるだけ早く停止させる中断ポリシーを実装する必要があります。
于 2012-06-27T15:41:53.857 に答える
0

独自のスタンドアロンアプリケーションを作成している場合は、スレッドを使用するのが最も簡単な方法かもしれません。Java EE環境を使用している場合は、独自のThreadオブジェクトを作成するのではなく、他のメカニズム(メッセージの送信や、送信したシグナルをメッセージリスナーに処理させるなど)を使用する必要があります。これは、JavaEEコンテナにスレッドプールなどのリソース使用率を制御させるためです。

スレッドの使用例:

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
         executeSomeCodeInP1();
    }
});

Thread t2 = new Thread(new Runnable() {
    @Override
    public void run() {
         executeSomeCodeInP2();
    }
});

t1.start();
t2.start();

// if you want to wait for both threads to finish before moving on, 
// "join" the current thread
t1.join();
t2.join();
于 2012-06-27T04:46:50.880 に答える
0

スレッドは良い選択です...新しいスレッドを受け入れて開始するメソッドのようなもの...

于 2012-06-27T03:35:25.907 に答える
0

https://stackoverflow.com/a/2269177/454167によると、

AsyncTaskExecutorオブジェクトを返す [1]のようなものを使用できFutureます。その後、Future を待って、cp2 が成功を返すかどうかを知ることができます。

[1] http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/core/task/AsyncTaskExecutor.html#submit%28java.lang.Runnable%29

于 2012-06-27T03:35:49.137 に答える
0

もちろん、プレーンでシンプルなスレッドを使用でき
ます。プロセッサ クラスにさらにメソッドを追加する必要があり、実行順序を維持するためにその特定のインスタンスが必要であることがわかっている場合は、最初にメソッド foo を実行し、次にメソッド bar を実行するとします。それらを非同期で実行したいが、実行順序を維持する(最初にfoo、次にbar)場合、アクティブオブジェクトパターンを使用することを検討します。
プロセッサ クラスのユーザーには実装の詳細が隠されるため、このアプローチも使用することをお勧めします。
さらに、デコレータを提供することを検討してくださいオブジェクトにこの非同期機能を提供する /wrapper - このようにして、どのオブジェクトが非同期で実行され、どのオブジェクトが非同期で実行されないかを制御でき、非同期呼び出しに必要なコードで Processor クラスを「汚染」する必要がなくなります。
この場合の使用例は次のようになります -

AsyncProcessor ap  = new AsyncProcessor(p1);
ap.process();  //executed asynchronously
Proccessor p2 = new Processor();
p2.process(); //executed synchronously



別のアプローチは、あなたが述べたようにエグゼキューターを使用することです-これは、スレッドプールを実装し、「実行ユニットをそれにプッシュする」ことで実現できます。
実行ユニットには、ターゲット オブジェクト (cp1、cp2、...) と実行するメソッド (現在はプロセスのみ) が含まれます
。スレッドは、キューから「実行ユニット」を取得して実行します。
実装はアクティブ オブジェクトに似ていますが、「TaskExecutor」クラスを使用して「実行ユニット」を提供するため、ユーザーの「インターフェース」は異なります。

于 2012-06-27T03:32:18.280 に答える