5

ユーザーが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;
        }
    }

[オンにする] ボタンが押されるたびに、actionPerformed はサーバーが既にオンになっているかどうかを判断し、そうでない場合は実行します

SwingWorkGUI swg = new SwingWorkGUI(); 
swg.execute();

次の命令で実行がブロックされますが、2 回目 (3 回目) だけ呼び出されます。

mainServer = new Server();

Server.up は、サーバーで while(true) メソッドを強制終了するのに役立つ静的変数です。

すべてのアプリケーションを閉じずに、開いているインスタンスを強制終了するにはどうすればよいですか?

4

1 に答える 1