無事に終了する前に、すべてのスレッドをクローズする方法

アレクサンダー・デ・スーザ:

私はいくつかのスレッドを起動するアプリケーションを持って、最終的にスレッドはアプリケーション全体を終了する必要があり、私は彼らが終了する前に、現在のループを継続させたいのですので、しかし、他のスレッドがタスクの途中であってもよいです。

スレッド1が終了しようとしているとき、スレッド2以下の例ではないアイデアを持っていない、それは単に、すぐにフィニッシュにすべてを強制します。

どのようにしてみましょうことができますスレッド2、3&4などがシャットダウンする前にループを仕上げますか?

編集:重複した質問の懸念に対処するために:親クラスがシャットダウンをパペットを担当することができないという点で、これは典型的な状況によって異なり、個々のスレッドのいずれかがシャットダウンを開始できる必要があります。

EDIT2は:私はまた、私は受け入れ答えの実装であるやってしまったものと答えを残してきました。

class Scratch {
    public static void main(String[] args) {
        Thread Task1 = new Thread(new Task1());
        Task1.start();

        Thread Task2 = new Thread(new Task2());
        Task2.start();

        // ... more threads
    }

    public class Task1 implements Runnable {
        public void run() {
            while (true) {
                // ...
                System.exit(0);
                // ...
            }
        }
    }

    public class Task2 implements Runnable {
        public void run() {
            while (true) {
                // ...
                // I need to know about System.exit(0) to exit my loop
                // ...
            }
        }
    }
}
HugoTeixeira:

あなたは使用することができvolatile boolean、すべてのスレッドが常にチェックすることを変数を。1つのスレッドがにその変数の値を設定した場合false、すべてのスレッドが新しい値を確認し、残すwhileループを。

説明:読み込み/書き込み操作volatile変数はアトミックです。すべてのスレッドが同じ値を参照してくださいので、それに加えて、揮発性の変数の値は、キャッシュされません。

class Scratch {

    private static volatile boolean isRunning = true;

    public static void main(String[] args) {
        Thread Task1 = new Thread(new Task1());
        Task1.start();

        Thread Task2 = new Thread(new Task2());
        Task2.start();

        // ... more threads
    }

    public class Task1 implements Runnable {
        public void run() {
            while (isRunning) {
                // ...
                isRunning = false; // let's stop all threads
                // ...
            }
        }
    }

    public class Task2 implements Runnable {
        public void run() {
            while (isRunning) {
                // ...
                // I need to know about System.exit(0) to exit my loop
                // ...
            }
        }
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=175343&siteId=1