Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java多线程_Java_Multithreading_Timer - Fatal编程技术网

java多线程

java多线程,java,multithreading,timer,Java,Multithreading,Timer,我正在使用java命令执行一个批处理文件,并读取放入数据库的文本文件中的批处理数据。例如,我必须在15分钟的时间间隔内使用相同的批处理文件运行430个节点。所以我把430个节点分成12个线程,每个线程包含40个指向同一批处理文件的节点。但是并行运行的线程不能等待批处理文件命令完成。我不能等待每个线程,因为所有任务都应该在15分钟内完成。有什么建议吗 下面是一段运行多线程的代码 for (int i = 0; i < noOfMainThreads; i++) { // r

我正在使用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());
            }
        }
    }
for(int i=0;i
创建一个作业对象,该对象包含执行任务所需的所有信息,并包含结果字段。创建所有作业对象并将其放入队列中,以便服务运行它们

因此,第一步是创建430个作业来运行批处理程序。每个作业将启动批处理程序并等待其终止。批处理终止后,读取输出并将其放入作业实例中

创建一个并行运行N个作业的执行器。您需要调整N;如果是CPU密集型任务,则N==内核数。如果是IO密集型作业,请尝试更高的值(CPU内核通常工作正常的2-4倍)

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

保留作业计数器(已开始、已完成),以便知道何时停止


.

我认为您应该使用CyclicBarrier,barrier允许您在特定点等待,直到所有线程到达barrier,因此在执行批处理后,您应该调用CyclicBarrier的等待。这里可以找到一个很好的代码示例:

“线程无法等待批处理文件命令完成”为什么不?请正确缩进代码。这是一个混乱,甚至包含不匹配的花括号。是否有任何批处理文件正在执行?您应该在
threadArr[i]=新线程(runnablarr[i]之前初始化
runnablarr[i]
)
非常感谢,我会检查一下并回复您