uthred Geschrieben 11. September 2013 Teilen Geschrieben 11. September 2013 Hi, Ich suche eine saubere Möglichkeit, das mehrfache Ausführen von einem Programm zu verbieten. Ich habe schon versucht mit dem Singelton-Prinzip die Main-Klasse nur einmal instanzierbar zu machen, jedoch wird die View zwei mal erzeugt, wenn ich das Programm zwei mal starte :beagolisc Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schiller256 Geschrieben 11. September 2013 Teilen Geschrieben 11. September 2013 Das Problem wirst du in Java nicht gelöst bekommen. Denn wenn dein Programm gestartet wird bekommst du einen Java Prozess im System unter dem es läuft. Wenn du dein Programm ein zweites mal startest bekommst du einen zweiten java Prozess dieser weiß aber von deinem ersten Prozess nichts und dann auch nichts von deinem Singleton in deinem ersten Programm. Was möglich wäre, ist das du in deinem Programm schaust ob es schon einen Java Prozess mit deinem Programm gibt und dann dein zweites Programm nicht noch einmal starten. Das ist aber in meinen Augen keine saubere Lösung. Denn du musst ganz genau schauen das es wirklich dein Java Prozess ist denn es kann durchaus sein das es noch andere Java Prozesse gibt. Weitere Möglichkeit ist du schreibst eine lock Datei. Hat aber den Nachteil das du auch dafür sorgen musst das diese Datei nach einem Programmabsturz wieder weg geräumt wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 11. September 2013 Teilen Geschrieben 11. September 2013 Ganz nettes Beispiel: Java Blog Buch : D) Java-Anwendung nur einmal ausführen aber wirklich eine ausgereifte vernünftige methode gibts nicht. Prozesse beim start auslesen und gucken ob schon was läuft .... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uthred Geschrieben 12. September 2013 Autor Teilen Geschrieben 12. September 2013 Ich habe jetzt die Lösung mit den blokierten Port genommen. Danke für die Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast runtimeterror Geschrieben 12. September 2013 Teilen Geschrieben 12. September 2013 (bearbeitet) Die Methode mit dem Port setzt allerdings voraus, dass keine Firewall das blockiert, der Port nicht durch eine völlig andere Anwendung benutzt wird und dass überhaupt ein IP-Stack auf dem Gerät installiert ist. Mir wäre das zu heikel. Ich kann die Methode FileChannel.tryLock() auf eine bestehende Datei empfehlen - da sehe ich keinerlei Nachteile. Nachtrag: Der verlinkte Code spezifiziert keine IP-Adresse - wenn sich zwischen den beiden Anwendungen das Default-Adapter ändert, dürfte das meinem Verständnis nach nicht richtig funktionieren. Hierfür sollte man InetAddress.getLoopbackAddress() nutzen. Bearbeitet 12. September 2013 von runtimeterror Hinweis auf IP vs. Loopback eingefügt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast runtimeterror Geschrieben 12. September 2013 Teilen Geschrieben 12. September 2013 Prozesse auslesen bringt aber bei Java nichts, da sich die laufenden JVMs nicht unterscheiden lassen. Es gibt ein paar komplizierte Tricks, die JVM-Instanzen beim Start über einen Launcher entsprechend zu benennen - einfacher ist es jedoch auf einen Lock-Mechanismus des Betriebssystems zurückzugreifen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uthred Geschrieben 13. September 2013 Autor Teilen Geschrieben 13. September 2013 Die Methode mit dem Port setzt allerdings voraus, dass keine Firewall das blockiert,... Das wäre mir eigentlich auch zu heikel, allerdings ist für das Programm sowieso eine Soketkommunikation vorgesehen, dafür werden schon Ports belegt (damit andere Programme mit diesem kommunizieren können) von daher gehe ich das Risiko einfach ein Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.