Как позволить выполнять только один экземпляр программы Java за один раз?

Если вы хотите использовать цвета, предварительно определенные в платформе Android, используйте синтаксис @android: color / white. «Android:» в начале означает, что ресурс не является частью вашего приложения.

27
задан Tom Hawtin - tackline 3 June 2009 в 00:00
поделиться

5 ответов

Я думаю, что ваше предложение открыть порт для прослушивания при запуске приложения - лучшая идея.

Это очень легко сделать, и вам не нужно беспокоиться об очистке при закрытии приложения. Например, если вы пишете в файл, но кто-то затем убивает процессы с помощью диспетчера задач, файл не будет удален.

Кроме того, если я правильно помню, нет простого способа получить PID процесса Java изнутри JVM, поэтому не пытайтесь формулировать решение, используя PID.

Что-то вроде этого должно помочь:

private static final int PORT = 9999;
private static ServerSocket socket;    

private static void checkIfRunning() {
  try {
    //Bind to localhost adapter with a zero connection queue 
    socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
  }
  catch (BindException e) {
    System.err.println("Already running.");
    System.exit(1);
  }
  catch (IOException e) {
    System.err.println("Unexpected error.");
    e.printStackTrace();
    System.exit(2);
  }
}

Этот пример кода явно привязывается к 127.0.0.1 , что должно избегать любых предупреждений брандмауэра, поскольку любой трафик по этому адресу должен поступать из локальной системы.

При выборе порта старайтесь избегать порта, упомянутого в списке хорошо известных портов .

35
ответ дан 28 November 2019 в 04:38
поделиться

Поскольку в вопросе указано, что используется WebStart, очевидным решением является использование javax.jnlp.SingleInstanceService .

Эта служба доступна в 1.5. Обратите внимание, что 1.5 в настоящее время почти полностью подошла к концу срока службы. Установите Java SE 6!

26
ответ дан 28 November 2019 в 04:38
поделиться

Я думаю, что лучше было бы использовать блокировку файлов (довольно старая идея :)). Начиная с Java 1.4 была представлена ​​новая библиотека ввода-вывода, которая позволяет блокировать файлы.

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

Пример выполнения блокировки файлов приведен, например, в Альманахе разработчиков Java .

Если вы хотите использовать блокировку файлов в приложении Java Web Start или апплет, необходимый для пения приложения или апплета.

3
ответ дан 28 November 2019 в 04:38
поделиться

Мы делаем то же самое в C ++, создавая объект мьютекса ядра и ища его при запуске. Преимущества те же, что и при использовании сокета, т.е. когда процесс умирает / аварийно завершается / завершается / завершается, объект мьютекса очищается ядром.

Я не программист на Java, поэтому я не уверен, вы можете делать то же самое на Java?

1
ответ дан 28 November 2019 в 04:38
поделиться

Вы могли бы использовать реестр, хотя это без особого энтузиазма противоречит цели использования языка высокого уровня, такого как java. По крайней мере, ваша целевая платформа - windows = D

0
ответ дан 28 November 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: