2012-01-21 6 views
2

Итак, я упаковал свой проект как единую исполняемую банку, которая отлично работает. Но иногда случается, что пользователь запускает файл несколько раз, и это заставляет его запускать несколько экземпляров одного и того же проекта (что вызывает непредвиденное поведение, например, перезаписывание значений в файлах с задержкой экземпляров проекта).Запуск только одного экземпляра исполняемого файла Jar

Я хочу знать о платформе Windows (Win7), каковы варианты блокировки выполнения только один раз, а затем, если банка уже запущена, просто не продолжайте выполнение кода еще раз.

Я читал об идентификаторах процесса, но если есть несколько приложений Java, все они в конечном итоге отображают изображение как javaw.exe и как я могу определить собственный идентификатор процесса?

Пожалуйста, сообщите, что такое правильный способ сделать это, спасибо!

ответ

3

Простейшим решением является использование фиксированного неиспользуемого порта.

ServerSocket ss; 
try { 
    ss = new ServerSocket(MY_PORT); 
    // not already running. 
} catch (BindException e) { 
    // already running. 
} 
+0

Огромное вам спасибо, это, безусловно, лучшее решение для любого platoform :) – Johnydep

1

Основываясь на моем опыте, лучшим подходом, который я использовал, было создание прослушивающего ServerSocket на определенном порту (например, 61234). Сокет ничего не делает, но если вам удастся его создать, это означает, что никакой другой процесс не был запущен. Дублированные экземпляры исполняемого файла jar не смогут создать ServerSocket на том же порту, и поэтому они должны выйти.

1

Вы можете открыть ServerSocket на выделенном TCP-порту при запуске приложения и закрыть его при завершении работы приложения.

Если экземпляр уже запущен, вы получите исключение «Порт в использовании».

Смежные вопросы