【问题标题】:java multi-threadingjava多线程
【发布时间】:2012-09-11 11:47:40
【问题描述】:

我正在使用 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());
            }
        }
    }

【问题讨论】:

  • "线程无法等待批处理文件命令完成" 为什么不呢?
  • 请正确缩进您的代码。这是一团糟,甚至包含不匹配的大括号。
  • 是否有任何批处理文件正在执行?你应该在threadArr[i] = new Thread(runnableArr[i]);之前初始化runnableArr[i]

标签: java multithreading timer


【解决方案1】:

请改用ExecutorService。构建一个管道,其中每个步骤的工作方式如下:

创建一个作业对象,其中包含完成任务的所有信息并包含结果字段。创建所有作业对象并将它们放入队列以供服务运行。

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

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

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

保留一个作业计数器(开始、结束),以便您知道何时停止。

Tutorial.

【讨论】:

  • 非常感谢,我会检查并回复您
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多