Prevent launching multiple instances of a java application

executable-jar, java, runtime

Solution

You could use a FileLock, this also works in environments where multiple users share ports:

String userHome = System.getProperty("user.home");
File file = new File(userHome, "my.lock");
try {
    FileChannel fc = FileChannel.open(file.toPath(),
            StandardOpenOption.CREATE,
            StandardOpenOption.WRITE);
    FileLock lock = fc.tryLock();
    if (lock == null) {
        System.out.println("another instance is running");
    }
} catch (IOException e) {
    throw new Error(e);
}

Also survives Garbage Collection. The lock is released once your process ends, doesn't matter if regular exit or crash or whatever.

Problem

I want to prevent the user from running my java application multiple times in parallel. To prevent this, I have created a lock file when am opening the application, and delete the lock file when closing the application. When the application is running, you can not open an another instance of jar. However, if you kill the application through task manager, the window closing event in the application is not triggered and the lock file is not deleted. How can I make sure the lock file method works or what other mechanism could I use?

Original source

Related problems