私は、ユーザーがGUIからサーバーをオンまたはオフにできるクライアントサーバーアプリケーションを作成しています。それを動作させるために、私はSwingWorkerネストされたクラスを使用します。 すべて正常に動作しているようですが、サーバーの電源を切って再度電源を入れても機能しない場合は、おそらく上書きできないインスタンスが存在するためです。サーバーは受け入れ時にブロックされます) 方法。 ユーザーがスイッチをオフにしたときに前のインスタンスを強制終了したいが、どうすればよいか分からない。ここで別のクラスのクラスのインスタンスを削除するにはどうすればよいですか?
は私に問題を与えて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;
}
}
ボタンをオンを押すと、actionPerformedのサーバが上か、すでにあるかどうかを判断し、その後、
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
を実行している場合ではありません
実行ブロックは次の命令で呼び出されますが、呼び出されるのは2回目(3回目)です。
mainServer = new Server();
Server.upはサーバーのwhile(true)メソッドを強制終了するのに役立つ静的変数です。私はすべてのアプリケーションを閉じずに開いているインスタンスを殺すことができる方法
?
あなたはそのスレッドへの参照を格納し、それに '割り込みを()'を呼び出した後、サーバーへの参照をクリーンアップすることができます別のスレッドでサーバーを実行している場合。これにより、サーバーは何をしていても終了するはずです。 (おそらく、 'Server'で' InterruptedException'をキャッチし、必要に応じて内部クリーンアップを行いたいと思うでしょう)。 – SamYonnou
'socket.accept()'メソッドを中断してサーバーをシャットダウンするには、外部スレッドから 'socket.close()'を呼び出す:http://stackoverflow.com/questions/2983835/how-can-i-interrupt- a-serversocket-accept-method – DannyMo