-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 倍运行良好)。

将所有作业放入执行者的队列中。等待完成的作业,从它们创建新作业并将它们放入执行器的输入队列中。

保留一个工作计数器(开始,完成),以便您知道何时停止。

教程

于 2012-09-11T12:00:39.970 回答
0

我认为你应该使用 CyclicBarrier,屏障允许你在特定点等待,直到所有线程都到达屏障,所以在执行批处理后你应该调用循环屏障的等待。可以在这里找到一个很好的代码示例:在此处 输入链接描述

于 2013-03-18T21:45:39.123 回答