Sto creando un'applicazione client-server, in cui l'utente può accendere o spegnere il server da una GUI; per farlo funzionare, uso una classe annidata di SwingWorker. Tutto sembra funzionare correttamente, ma quando spengo il server e lo riaccendo non funziona, probabilmente perché c'è ancora un'altra istanza aperta che non può essere sovrascritta: il server è bloccato sull'accettazione () metodo. Voglio uccidere l'istanza precedente quando l'utente preme il pulsante di spegnimento, ma non so come.Come si elimina un'istanza di una classe in un'altra classe?
Ecco la classe SwingWorker che mi dà problemi:
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;
}
}
Ogni volta che il pulsante Attiva viene premuto, l'actionPerformed determina se il server è già acceso o no, allora se non corre
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
I blocchi di esecuzione nelle seguenti istruzioni, ma solo la seconda (terza, ecc.) Ora si chiama:
mainServer = new Server();
Server.up è una variabile statica che consente di eliminare il metodo while (true) nel server.
Come posso eliminare l'istanza aperta senza chiudere tutta l'applicazione?
Se si esegue il server su un thread separato è possibile memorizzare un riferimento a quel filo e chiamare 'interrupt()' su di esso e poi ripulire il riferimento al server. Ciò dovrebbe causare il server per chiudere qualsiasi cosa stia facendo. (Probabilmente vorrai anche prendere 'InterruptedException' su' Server' e fare un po 'di pulizia interna, se necessario). – SamYonnou
Chiama 'socket.close()' da un thread esterno per interrompere il metodo 'socket.accept()' e poi spegni il server: http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-ServerSocket-accetta-metodo – DannyMo