Я делаю клиент-серверное приложение, в котором пользователь может включить или отключить сервер от gui; чтобы он работал, я использую вложенный класс SwingWorker. Все, кажется, работает правильно, но когда я выключаю сервер и снова включаю его, он не работает, возможно, потому что есть еще один открытый экземпляр, который нельзя перезаписать: сервер заблокирован на accept (). Я хочу убить предыдущий экземпляр, когда пользователь нажимает кнопку отключения, но я не знаю, как это сделать.Как убить экземпляр класса в другом классе?
Вот класс SwingWorker, который дает мне проблемы:
class SwingWorkGUI extends SwingWorker
{
@Override
protected Integer doInBackground() throws Exception {
int delay = 1000;
final Timer time = new Timer(delay, null);
time.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (Server.up == true){
upTimeMillis += 1000;
long diff = upTimeMillis/1000;
long numHrs = diff/60;
diff = diff%60;
long numMins = diff/60;
long numSecs = diff%60;
upTime.setText(numHrs + ":" + numMins + ":" + numSecs);
}
else {
upTime.setText("Server Actually Down");
time.stop();
}
}
});
time.start();
mainServer = new Server();
return null;
}
}
Everytime Включить кнопки нажимается, то actionPerformed определяет, является ли сервер уже или нет, то, если не работает
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
Выполнение блоков в следующей инструкции, но только второе (третье, ecc.) Время, которое оно вызывается:
Server.up - статическая переменная, которая помогает мне убить метод while (true) на сервере.
Как я могу убить открытый экземпляр, не закрывая все приложение?
Если вы используете сервер в отдельном потоке вы можете сохранить ссылку на эту нить и вызвать 'прерывания()' на него, а затем очистить ссылку на сервер. Это должно заставить сервер отказаться от всего, что он делает. (Вероятно, вы также захотите поймать 'InterruptedException' на 'Server' и выполнить некоторую внутреннюю очистку по мере необходимости). – SamYonnou
Вызовите 'socket.close()' из внешнего потока, чтобы прервать метод 'socket.accept()', а затем выключите ваш сервер: http://stackoverflow.com/questions/2983835/how-can-i-interrupt- а-ServerSocket-Accept-метод – DannyMo