Я создаю класс, который позволяет мне открывать один экземпляр моей Java-программы.Он использует поток демона, который открывает ServerSocket.если порт TCP уже был занят, выдается исключение во время создания экземпляра.
Код работает нормально в Linux и Windows.
Вот код, который я использую:
public class SingleInstaceHandler extends Thread {
private static final Logger log = Logger.getLogger(IEPLC_Tool.class);
private boolean finished = false;
@SuppressWarnings("unused")
private ServerSocket serverSocket;
/*
* Constructor
* Generate the server socket.
* If the TCP door was busy throws IOException.
*/
public SingleInstaceHandler() throws IOException {
@SuppressWarnings("unused")
ServerSocket serverSocket = new ServerSocket(44331);
this.setDaemon(true);
this.start();
log.info("Server socket initialized"); //if commented out it works
}
public void run() {
synchronized (this) {
while (!finished) {
try {
log.debug("Server socket goes to sleep");
this.wait();
log.debug("Server socket waken up");
} catch (InterruptedException e) {
log.debug("ERROR while sending SocketThread2 in wait status");
e.printStackTrace();
System.exit(-1);
}
log.info("Server socket end");
}
}
}
public synchronized void shutdown() {
log.debug("SingleInstaceHandler shutdown() caled");
finished = true;
notifyAll();
}
}
Иногда вместо этого порт не занят ... любая идея?
ОБНОВЛЕНО ПОСЛЕ ДАЛЬНЕЙШИХ ИСПЫТАНИЙ:
при выполнении многих других тестов.он показывает, что если порт занят чем-то вроде другого экземпляра SW, new ServerSocket(44331);
выдает исключение, но иногда, даже если порт по какой-то причине не занят, он не может получить этот ресурс.в этом случае исключение не запускается, и я могу открыть столько экземпляров, сколько захочу для моего приложения.может быть, я должен сделать какую-то другую операцию, чтобы заставить поток заблокировать порт ...
любая идея?
Спасибо,
Ste