0

私は Java でのマルチスレッド化が初めてで、スレッドを停止する方法がわかりません。ArrayList止めたいスレッドがあります。ここに私のコードのスニペットがあります:

class PrimeThread implements Runnable {
    public void run() {
        while(flag) {
        //do some stuff
        }
    }
    public void cancel() {
        flag = false;
    }
...
}
Class MainClass {
    public static void stopPrimeThreads() {
        for(int i=0; i<primeThreadList.size(); i++) primeThreadList.get(i).cancel();
    }
}

flag変数を に設定してスレッドを停止しようとしましたfalseflag変数はvolatile boolean、クラス自体で宣言されています。また、外側のクラス変数をセンチネルとして使用しようとしましたが、それも機能しませんでした。また、非volatile変数は仕事をしません。非推奨のstop()メソッドを使用すると、必要な動作が得られますが、非推奨のメソッドは使用したくありません。この問題を解決する方法を知っている人はいますか? 基本的な何かが欠けていますか?前もって感謝します。

4

5 に答える 5

1

この行で停止しないでキャンセル方法を使用してください...

primeThreadList.get(i).stop();

そのようです...

primeThreadList.get(i).cancel();
于 2012-12-02T13:34:24.287 に答える
1

非揮発性フィールドを使用した場合、JIT はそのフィールドの読み取りを最適化できます。つまり、スレッドで変更しないためです。フィールドを作成すると、volatile変更が常に表示されるようになります。

于 2012-12-02T13:38:17.893 に答える
1

内部ループを次のようにします

while (flag) {
   // smaller step 1
   if (!flag) break;
   // so on
}

補足として、内部ループに非常に長い時間がかかる場合は、次善のアルゴリズムを使用している可能性があります。ただし、非常に大きな数を扱う場合、長い計算時間は避けられません。

于 2012-12-02T13:43:48.677 に答える
1

SSCCE を提供していないため、これが機能しない理由を知るのは困難ですが、そのために設計された interrupt() を使用するだけで、スレッドが何らかのブロッキング メソッドを待機している場合でもスレッドを停止できます。

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        ...
    }
}

スレッドを停止するには:

thread.interrupt();

もちろん、選択した解決策が何であれ、外側のループ内に別の実行時間の長いループがある場合、スレッドは中断/キャンセルフラグの値をチェックするまで停止しません。できるだけ頻繁にフラグを確認してください。

于 2012-12-02T13:40:38.460 に答える
0
class PrimeThread implements Runnable {
    private volatile boolean flag = true;
    public void run() {
        while(flag) {
        //do some stuff
        }
    }
    public void cancel() {
        flag = false;
    }
...
}
Class MainClass {
    public static void stopPrimeThreads() {
        for(int i=0; i<primeThreadList.size(); i++) primeThreadList.get(i).cancel();
    }
}
于 2012-12-02T13:37:03.313 に答える