【问题标题】:Running the same jar file many times simultaneously同时多次运行同一个jar文件
【发布时间】:2012-09-07 08:07:16
【问题描述】:

我想多次运行保存在本地磁盘上的 jar 文件。 jar 文件应在给定实例中运行多次。 所有的 jar 文件(同一个文件)应该一起运行。有没有办法我可以实现它? 我是否必须编写一个代码来创建多个线程?

现在我暂时打开许多命令提示符并在 cmd 中分别调用 jar,因此同时运行它们。 但这不是一种有效的方式。有没有更有效的方法来做到这一点?

任何帮助将不胜感激。

【问题讨论】:

  • 定义“一起”、“同时”、“高效”。
  • @Tichodroma 同时:当所有 jar 文件都在同一个实例中运行时。一起:它类似于我上面的帖子中的同时。高效:我无法打开 20-30 个 cmd 窗口并单独运行它们,它对处理器的负载很重。
  • 你有多少个 CPU?如果你有 8 个核心,每个进程使用 1-2 个 CPU,你可能会发现运行 4-8 是最好的解决方案。

标签: java jar simultaneous


【解决方案1】:

我无法打开 20-30 cmd 窗口并单独运行它们,它对处理器的负载很重

使用该方法会产生 (20-30)-1 个 JVM 的开销。您可以像这样创建第二个主类:

public static void main(final String[] args) {
    int numberOfSimultaneousExecutions = 25;
    java.util.concurrent.Executor executor = java.util.concurrent.Executors.newFixedThreadPool(numberOfSimultaneousExecutions);
    for (int i = 0; i < numberOfSimultaneousExecutions; i++) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                RealMainClass.main(args);
            }
        });
    }
}

现在 JAR 在 一个 JVM 中同时运行。

但是,这很危险。如果您的代码正在访问(和修改)任何共享静态值,您的应用程序 几乎可以肯定 中断

您还可以从参数中获取同时执行的次数:

public static void main(final String[] argsWithNum) {
    int numberOfSimultaneousExecutions = Integer.parseInt(argsWithNum[0]);
    final String[] args = new String[argsWithNum.length - 1];
    System.arraycopy(argsWithNum, 1, args, 0, args.length);
    java.util.concurrent.Executor executor = java.util.concurrent.Executors.newFixedThreadPool(numberOfSimultaneousExecutions);
    ...

【讨论】:

  • 我必须将这段代码嵌入到我的主类中吗?如果我这样做,一个类怎么能积累两个主要的?
  • @Kishorepandey 不,您应该使用该 main 方法创建一个 second 主类,并将代码中的 RealMainClass 替换为您的正常主类的名称。
  • 对不起,伙计,我现在明白了。 RealMainclass 是我想多次运行的类的名称!
  • 如果我的 realmainclass 有一些想要通过的参数怎么办?因为我会在我的罐子里提到这个主要的。如何从这个 main 传递我的 realmainclass 中的 arg?非常感谢您回复队友!
  • 我在回答中为此添加了一个示例
【解决方案2】:

要运行某些东西,您需要一个线程。如果你想同时运行多次,你需要多个线程。并非所有代码都编写为线程安全的,因此您需要检查代码是否正确运行。

【讨论】:

  • 如何检查以及如何完成创建多线程?
  • 我会将任务提交给 ExecutorService(谷歌了解更多详情)。确保代码是线程安全的唯一方法是阅读文档,如果没有说明,请阅读代码以了解它是如何工作的。运行多个进程可能是最简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 2017-01-03
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多