3

スレッドの停止に関する多くの既存の回答を確認しました。以下に典型的なコードをコピーします。

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {

            public void run() {
                try {
                    while (!Thread.interrupted()) {
                        Thread.sleep(5000);
                        System.out.println("Hello World!");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        thread.start();
        System.out.println("press any key to quit");
        System.in.read();
        thread.interrupt();
    }
}

しかし、この解決策は while ループ コードで割り込みステータスを確認する必要があります。run メソッドで行っていることがシーケンシャルで単一パスの場合、割り込みステータスを 2 回確認する機会がありません。たとえば、停止したいすべてのディスクのものを検索しているスレッドで、多くの時間がかかります。

どうすればそれを止めることができますか?

4

3 に答える 3

3

if (!keepRunning) { break; } else { do next directory/file(); }長期にわたるプロセスでは、ループから抜け出すために言うことができるいくつかのポイントが必要です。

ストローマンの例では、ディスクを検索している場合、すべてのファイルとディレクトリを処理してこのチェックロジックを含める前に、そこにポイントがあります。

巨大なファイルの暗号化や非常に大きなファイルの転送など、非常に長時間実行されるプロセスがある場合でも、これらのフラグ チェックをプロセスに埋め込むことができます。この例では、バイト ブロックを転送し、送信する各ブロックを作成する前に、フラグの状態を確認します。ある時点ですべてを段階的に実行する必要があり、各段階の前にフラグ チェックを入れることができます。.sleep()不自然な例や、何かが起こるのを永遠に待つ接続ロジック以外に、長時間実行されるステージやステップを持たないものは考えられません。

あなたが遭遇している正確な問題がなければ、より具体的な方法であなたの質問に答えるのは非常に難しいでしょう. 実際に問題が発生しているコードをいくつか示します。

于 2012-10-11T06:10:41.803 に答える
0

スレッドを停止することは悪いことです。スレッド自体を停止 (実行を終了) する必要があります。メインスレッドは、たとえばプロパティを設定することで、停止するようにスレッドに通知できます。

于 2012-10-11T06:08:51.363 に答える
0

「すべてのディスクを検索する」スレッドは、タイムリーに中断できるように実装する必要があります。

于 2012-10-11T06:09:06.673 に答える