4

いくつかの入力を受け取り、それらに対してアルゴリズムを実行するプログラムの GUI を作成しています。アルゴリズムのコードはかなり長く複雑なので、入力の計算を実行するために GUI から新しいスレッドを起動しました。

//algorithmThread previously initialized 
 if(e.getSource() == startButton) {
        if(update.updateStrings(textFields)) {
            algorithmThread.start();  
        }
    }

ユーザーが間違った入力ファイルを提供した場合に、ユーザーが計算を停止できるようにする機能を追加したいと考えています (私のラップトップでは、結果が生成されるまでに約 30 分実行されます)。これが私がそれを処理する方法です。

 else if(e.getSource() == stopButton) {
        //if the user presses the stop button then intterupt the 
        //thread running the algorithm
        algorithmThread.interrupt();
        System.out.println("algorithm stopped"); //debugging code
        //recreate the thread in case the user hits the start button again
        algorithmThread = new Thread() {
                public void run() {
                    runNOC();
                }
            };
    }

プログラムはアルゴリズムを正常に停止し(例外処理を行う必要があると思いますが)、ユーザーが新しい入力を入力して再起動できるようにします。私の質問は、アルゴリズムのコードで Thread.interrupted() をチェックする必要があるのはどのような条件ですか? 必要/ベストプラクティスですか?または、上記の方法でスレッドを停止することは許容されますか?

4

2 に答える 2

4

メソッドが行うのThread.interrupt()は「中断」フラグを設定することだけなので、この方法でスレッドを停止するには連携が必要です。たとえば、アルゴリズムは、反復ごとに 1 回など、時々割り込みステータスをポーリングする必要があります。この例は、Java 同時実行チュートリアルで見ることができます。

GUI を使用しているため、SwingWorker. doneこのクラスには、メソッドを使用して計算が終了したときに GUI を更新したり、を使用せずに計算をキャンセルしたりするなど、GUI プログラミングに便利な機能がたくさんありますThread.interrupt()。この方法でキャンセルするには、スレッドからの協力が必要ですがInterruptedException、スレッドが でスリープしているThread.sleep場合や でロックを待機している場合など、スレッドを中断すると がスローされるため、より安全Object.waitです。

于 2013-09-29T16:53:30.063 に答える