【问题标题】:How to launch an independent java class from another class?如何从另一个类启动一个独立的java类?
【发布时间】:2016-09-24 09:59:03
【问题描述】:

我需要一个创建其他独立类实例的“主”类。他们是独立的,因为他们有自己的控制台,如果我关闭 1,其他人不会关闭。

例子:我有这两个类

public class Class1 {

    public static void main(String[] args) {
        new Class1();
    }

    Class1() {
        System.out.println("class1");
        Scanner sc = new Scanner(System.in);
        sc.next(); // just to stop runtime from exiting. it suspends it
    }
}

public class Class2 {

    public static void main(String[] args) {
        new Class2();
    }

    Class2() {
        System.out.println("class2");
        Scanner sc = new Scanner(System.in);
        sc.next();  // just to stop runtime from exiting. it suspends it
    }
}

如果我从我的 IDE 启动每一个,我就会得到我想要的。但是现在我只想通过从 class1 启动 class2 来获得相同的结果(实际上从 class 1 中启动了许多 class 2,但获得 1 会让我得到其他的)。我尝试使用类加载器,但它不起作用,只是共享同一个控制台,关闭 1 关闭另一个。或者我做错了。

Class1() {
    System.out.println("class1");
    try {
        Class<?> c = ClassLoader.getSystemClassLoader().loadClass("test.Class2");
        c.newInstance();
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
    Scanner sc = new Scanner(System.in);
    sc.next();
}

我不在乎我是调用类 2 的构造函数还是它的 main 方法,只要它有效。但我发现从 1 个类调用 main 并不像类加载器在启动时那样特别。

我不知道我是否需要一个新进程、一个新 VM 或一个新类加载器,因为我不知道控制台是如何共享的,实际上我认为我不知道它们之间的区别。我知道系统退出会退出虚拟机,所以我想我需要启动一个新的虚拟机?我一定要吗?我在这个网站上看到了几个关于如何做到这一点的问题,但它非常难看,而且看起来不健壮。

【问题讨论】:

  • 我不明白为什么人们会无缘无故地投反对票?
  • 在这种情况下,他们很可能是有原因的,但我不明白为什么人们会跑来跑去投票并且不给出理由。
  • 如果你想让每个类在自己的控制台中运行并且能够独立退出,你需要为每个类设置一个进程。

标签: java process jvm classloader


【解决方案1】:

在您的Class1 中试试这个:

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "start", "java", "Class2");
pb.start();

这将启动一个新控制台并运行您的Class2.java

您可能需要与/c 不同的东西,这取决于您想要什么,check this out.

【讨论】:

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