-3

javaコマンドを使用してバッチファイルを実行し、データベースに配置するテキストファイルのバッチデータを読み取ります。たとえば、同じバッチファイルを使用して15分間隔で430ノードを実行する必要があります。そこで、430ノードを12スレッドに分割したので、各スレッドには同じバッチファイルを指す40ノードが含まれています。ただし、並列で実行されているスレッドは、バッチファイルコマンドが完了するのを待つことができません。すべてのタスクが15分以内に完了するはずなので、各スレッドを待つことはできません。助言がありますか?

以下は、マルチスレッドを実行するコードの一部です。

 for (int i = 0; i < noOfMainThreads; i++) {
        // running 12 thread for 40 node 
        threadArr[i] = new Thread(runnableArr[i]);
        runnableArr[i] = new CodeBatchfile(nodeArr,nodeidArr);
    }

    for (int i = 0; i < noOfMainThreads; i++) {
        threadArr[i].start;
    } 


 class CodeBatchfile{  


    void run(){
        for (int i=1;i<nodename.length;i++) {
            // exciting batch file using 12 threads.
            cmd = filepath + " " + nodenamelocal;
            try {
                process = Runtime.getRuntime().exec(cmd, null, bdir);
                process.waitFor();
            }
            catch(Exception ex) {
                System.out.println("Exception Running batch file" + ex.getLocalizedMessage());
            }
        }
    }
4

2 に答える 2

1

代わりにExecutorServiceを使用してください。各ステップが次のように機能するパイプラインを構築します。

タスクを実行するためのすべての情報を持ち、結果のフィールドを含むジョブ オブジェクトを作成します。すべてのジョブ オブジェクトを作成し、それらをサービスのキューに入れて実行します。

したがって、最初のステップは、バッチ プログラムを実行するための 430 のジョブを作成することです。各ジョブはバッチ プログラムを開始し、終了するまで待機します。バッチが終了したら、出力を読み取り、それをジョブ インスタンスに入れます。

N 個のジョブを並行して実行するエグゼキュータを作成します。N を調整する必要があります。CPU を集中的に使用するタスクの場合、N == コア数。IO 集中型のジョブの場合は、より高い値を試してください (通常、CPU コアの 2 ~ 4 倍で問題なく動作します)。

すべてのジョブを実行者のキューに入れます。ジョブが終了するのを待ち、それらから新しいジョブを作成し、executor の入力キューに入れます。

いつ停止するかがわかるように、ジョブ カウンター (開始、終了) を保持します。

チュートリアル

于 2012-09-11T12:00:39.970 に答える
0

CyclicBarrier を使用する必要があると思います。バリアを使用すると、すべてのスレッドがバリアに到達するまで特定のポイントで待機できるため、バッチを実行した後、cyclicBarrier の待機を呼び出す必要があります。良いコード例はここにあります: ここ にリンクの説明を入力してください

于 2013-03-18T21:45:39.123 に答える