проверить для единственного экземпляра Java-программы - PullRequest
7 голосов
/ 22 ноября 2011

У меня есть программа на Java (с интерфейсом Swing), и я бы хотел, чтобы существовал только 1 экземпляр.Если бы он попытался открыть другой экземпляр программы, я бы хотел, чтобы текущий экземпляр был выведен на передний план.

Как мне это сделать?

Заранее спасибо.

Ответы [ 6 ]

4 голосов
/ 22 ноября 2011

Запустите приложение с помощью Java Web Start и реализуйте SingleInstanceService JNLP API .Вот демоверсия .SingleInstanceService.

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

Подключите это в методе newActivation (String []) в SingleInstanceListener.Будут переданы любые аргументы, которые были предоставлены для нового запуска.Существующий экземпляр решает, что делать с новыми аргументами (например, изменить файл, добавить новую вкладку, игнорировать ..)

3 голосов
/ 22 ноября 2011

Вы можете сделать это, используя ShutDownHook и файл блокировки, см. Этот простой пример .

Я думаю, что это самый простой способ ...

2 голосов
/ 22 ноября 2011

В Java нет prev-instance, но вы можете создать pid-файл в каталоге temp (или / var / run). (И сделать это File.deleteOnExit() для очистки в любом случае при выходе)

Чтобы вывести существующее окно наверх, вы можете уведомить программу самостоятельно, через именованный канал, сокет unix или вызов удаленного метода java и т. Д. Простой и грязный способ - записать небольшой файл, скажем $TEMP/foobar-app.bring-to-top , и программа должна периодически опрашивать этот маленький файл, если он существует, вывести окно наверх и удалить этот маленький файл.

Я полагаю, что Java не может обрабатывать сигналы, т. Е. kill -HUP PID может не работать для приложений Java. Даже если это возможно, не у каждой ОС есть сигналы.

1 голос
/ 27 мая 2015

Я сделал это один раз с Socket и ServerSocket:


Во-первых, когда вы запускаете ваше приложение, сделайте ServerSocket прослушивание на некотором порте, например 4004. Хитрость заключается в том, чтобы проверить, бросает ли он IOException. Если это так, то либо другое приложение работает, либо порт используется другим приложением ( проверьте этот список для часто используемых портов ; обратите внимание, что порты TCP и UDP не блокируют друг друга), в противном случае вы можете продолжить с запуском вашего приложения. Если экземпляр в данный момент запущен, вы можете уведомить его, подключив TCP Socket (который гарантирует, что ваше соединение приходит; UDP не подключается).

Вот пример:

ServerSocket ss = null;
try {
    ss = new ServerSocket(4004);
} catch (IOException ex0) {
    // Port either occupied by your application or a foreign one
    // -> Connect
    Socket s = null;
    try {
        s = new Socket();
    } catch (Exception ex1) {
        // Something went wrong
    }
    if (s != null) {
        // Send some singnal
    }
}
if (ss == null) {
    // Close or do something else
}

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

0 голосов
/ 22 ноября 2011

В C # вы обычно создаете Mutex при запуске приложения. Если вы не можете создать / получить его, другой экземпляр приложения уже запущен. К сожалению, я не уверен на 100%, ведет себя ли так же в Java или каков точный синтаксис.

Надеюсь, это поможет.

0 голосов
/ 22 ноября 2011

Шаблон синглетона:

class SingleInstance {
private static SingleInstance instance;

public SingleInstance getInstance() {
    if (instance==null)
        instance = new SingleInstance();
    return instance;
}

private SingleInstance() {
//construct it!
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...