Witam.
Chciałbym, aby moja aplikacja sprawdziła, czy nie jest czasem już uruchomiona. Chodzi mi o to, żeby jedna aplikacja nie była uruchomiona kilka razy. Da się jakoś to sprawdzić?
A co gdybys zapisal w jakims pliku czy gdzie kolwiek, 0 , i jak sie wlacza aplikacja to zamienia to na 1 a jak wylacza to zmienia to na 0. I jezeli odpali sie drugi raz jednoczesnie to po prostu w pliku bedzie 1, sie wylaczy.
Zrób klasę główną według modelu Singleton, wtedy na bank będzie uruchomiona tylko raz.
@qba7878 - nie, nie i jeszcze raz nie. Nie wprowadzaj ludzi w błąd.
Co do samego zadania - musisz się odwołać do czegoś zewnętrznego i "fizycznego". Możesz (jeśli to Winda) wpisywać jakąś wartość do rejestru - jest to znacznie pewniejsza metoda niż plik (bo plik Ci ktoś usunie, przeniesie, etc). Możesz wykluczanie zorganizować przez socket. Poszukaj informacji na ten temat w google. Teoretycznie możesz użyć System,setProperty()...
Pozdrawiam,
cytując za pierwszym wyszukanym guglem:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Uan {
private static final int RUN_PORT = 9666;
public static void main(String[] arg){
try{
java.net.ServerSocket ss = new java.net.ServerSocket(RUN_PORT);
String x;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
x=br.readLine();
}catch (java.net.BindException ex){
System.out.println("Program already running");
System.exit(1);
}
catch (java.io.IOException ex){
ex.printStackTrace();
System.exit(1);
}
}
}
koniec cytatu...
pzdr.
A co się dzieje jeśli z portu RUN_PORT korzysta inny program ?
@bogdans jest to niestety jeden ze znanych drawbacków tej metody...
@Shimmi, sterowanie błędami jest złe.
Jednak nie da sie tego uniknąć. Można zamiast socketu tworzyć plik tymczasowy, który będzie usuwany gdy program kończy działanie.
Warto też sprecyzować znaczenie zwrotu aplikacja jest uruchomiona. Załóżmy, że mamy dwa identyczne pliki Foo.jar jeden w katalogu k1, drugi w k2. Dajemy polecenie (w k1) java -jar Foo.jar. Czy identyczne polecenie (w k2) jest ponownym uruchomieniem aplikacji ? Jeśli tak. to sposoby z plikami tymczasowymi są kiepskie - pliki tymczasowe powinny mieć adresy względne.
Drugi problem. Mamy na komputerze dwie JVM (j1 i j2). Zapewne kolejne polecenia j1 -jar Fpp.jar j2 -jar Foo.jar powinno być traktowane jak ponowne uruchomienie aplikacji. Wtedy kiepskie są metody z singletonami, czy też polami statycznymi w klasie, które nie pozwolą na utworzenie drugiej instancji danej klasy.
Dlatego można skorzystać ze ścieżek bezwzględnych np. katalogu domowego użytkownika.