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