2016-09-24 2 views
-1

Ich brauche eine "Haupt" -Klasse, die andere unabhängige Klassen-Instanzen erstellt. Sie sind insofern unabhängig, als sie ihre eigene Konsole haben und wenn ich schließe, schließen die anderen nicht.Wie starte ich eine unabhängige Java-Klasse von einer anderen Klasse?

Beispiel: Ich habe diese zwei Klassen

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 
    } 
} 

und

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 
    } 
} 

Wenn ich jeden von meinen IDE starte ich bekommen, was ich will. Aber jetzt möchte ich das gleiche nur mit dem Starten von class2 von class1 (eigentlich viele Klasse 2 von Klasse 1, aber bekommen 1 bekommen mich die anderen bekommen). Ich habe versucht, mit einem Klassenlader, aber es funktioniert nicht nur die gleiche Konsole und Schließen 1 schließt die andere. Oder ich habe es falsch gemacht.

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(); 
} 

Es ist mir egal, wenn ich den Konstruktor der Klasse 2 oder seine Hauptmethode aufrufen, solange es funktioniert. aber ich fand heraus, dass der Aufruf von main von 1 Klasse nicht speziell ist, wie wenn der Klassenlader es beim Start tut.

Ich weiß nicht, ob ich einen neuen Prozess, eine neue VM oder einen neuen Klassenlader brauche, weil ich nicht weiß, wie eine Konsole geteilt wird und ich glaube nicht, dass ich die Unterschiede kenne. Ich weiß, dass der System-Exit die VM verlassen wird, also denke ich, dass ich eine neue VM starten muss? Muss ich? Ich habe einige Fragen auf dieser Seite gesehen, wie es geht, aber es ist sehr hässlich und sieht nicht robust aus.

+0

ich nicht, warum Menschen ohne Grund downvote? – Mark

+0

Wahrscheinlich haben sie in diesem Fall einen Grund, aber ich verstehe nicht, warum die Leute ab und zu abstimmen und keinen Grund angeben. –

+1

Wenn Sie möchten, dass jede Klasse in einer eigenen Konsole ausgeführt wird und unabhängig beendet werden kann, benötigen Sie einen Prozess für jede Klasse. –

Antwort

1

Versuchen Sie dies in Ihrem Class1:

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

Das wird eine neue Konsole starten und Class2.java laufen.

Sie müssen möglicherweise etwas anderes als /c hängt, was Sie wollen, check this out.

+1

Ja, aber das ist das gleiche wie http://stackoverflow.com/questions/1229605/is-this-really-the-best-way-to-start-a-second-jvm-from-java-code und http: //stackoverflow.com/questions/480433/launch-jvm-process-from-a-java-application-use-runtime-exec und http://stackoverflow.com/questions/636367/executing-a-java-application- in einem separaten Prozess. – Mark

+0

@Mark, also sagst du, du hast deine Antwort schon? –

+0

@PeterLawrey anscheinend so. Ich habe gefragt, wie man etwas macht und die wirkliche Antwort ist, was Sie gesagt haben, dass ich einen neuen Prozess brauche. Wie man einen neuen Prozess erstellt, wurde bereits einige Male beantwortet. Ich weiß nicht, wofür die Regeln der Seite stehen. – Mark

Verwandte Themen