Programm einfach ausführen

Pendergast

Erfahrenes Mitglied
Servus,

das ist bestimmt schon hundertfach gefragt worden, nur schein ich gerade die richtigen Suchbegriffe nicht finden zu können. :rolleyes:

Wie kann ich verhindern, dass mein Java-Programm ein zweites Mal parallel zur ersten Instanz ausgeführt wird? Auf eine temporäre Datei, die ich irgendwo als "hey ich laufe schon"- Zaunpfahl zwischenspeichere, möchte ich dabei möglichst verzichten. Da gibt es doch auch bestimmt eine elegantere Lösung.

Hat die jemand grad parat?
 
Hallo!

Am besten geht man dazu so vor, dass man eine gemeinsame Resource wählt die nur von einem Programm in beschlag genommen werden kann (Lock-File, Socket Port... etc.)

Schau mal hier für ein Beispiel mit einem FileLock:
Code:
  /**
  * 
  */
 package de.tutorials;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 
 import javax.swing.JFrame;
 
 /**
  * @author Tom
  * 
  */
 public class OnlyOneProgrammInstanceExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		File file = new File("c:/lock.file");
 		if (!file.exists()) {
 			file.createNewFile();
 		}
 		FileOutputStream fos = new FileOutputStream(file);
 		FileChannel fc = fos.getChannel();
 		FileLock lock = fc.tryLock();
 		if (lock == null) {
 			System.out.println("An instance is already running...");
 			fc.close();
 			fos.close();
 			return;
 		}
 		new JFrame("Foo") {
 			{
 				setDefaultCloseOperation(EXIT_ON_CLOSE);
 				setSize(320, 240);
 			}
 		}.setVisible(true);
 	}
 }

Gruß Tom
 
Jetzt bin ich etwas verwirrt. Wenn ich mir zwei Konsolen öffne und in jeder Konsole das Programm mit der hier vorgestellten Methode versuche zu starten, dann läuft das Programm in der einen Konsole, und in der anderen wird erwartungsgemäß mit einer Fehlermeldung abgebrochen.

Nun wird mein Programm aber periodisch als Cronjob ausgeführt. Und wie ich jetzt bemerken muss, wird das Programm trotzdem nochmals aufgerufen, obwohl die Instanz, die vor 10 Minuten gestartet wurde noch nicht abgeschlossen ist.

Was nun?
 
Zurück