Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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 von runtimeterror
Hinweis auf IP vs. Loopback eingefügt

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.

  • Autor
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 :D

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.