4

私が持っていると言う:

class WriteThread extends Thread {
    char letter;
    boolean stop = false; 
    WriteThread(char letter) {
        this.letter = letter;
    }
    public void halt() { stop = true; }
    public void run() {
        while(!stop) { System.out.print(letter); }
    }
}

と:

WriteThread a = new WriteThread('a');
WriteThread b = new WriteThread('b');
a.start(); 
b.start();
// do some other stuff
a.halt();
b.halt(); // (*)

(*)が実行されると、両方のスレッドが停止することが保証されていますか?(停止とは、(*)の後にもう印刷がないことを意味します)

4

3 に答える 3

4

'stop'変数を揮発性にする必要があります。スレッドは、valeがtrueであると判断するとループを停止しますが、問題を混乱させる出力バッファリングが存在する可能性があります。

于 2013-02-26T00:48:23.140 に答える
1

もちろん違います。それは揮発性であるかどうかとは何の関係もありません、それは単にマルチスレッドの性質です。

a.halt()を呼び出した後、スレッドaには実行を継続する機会が与えられない場合があり、メインスレッドはb.halt()を実行します。その後、スレッドaはまだprintlnステートメントの直前にある可能性があります。

単純化したバージョンで、次のことがわかります。

MAIN THREAD                THREAD A
                           while (!stop)
a.halt()
                           println(...)

を呼び出した後もa.halt()a印刷を続行する機会がありますが、EVENstop変数は揮発性です。

特定の場所の後でスレッドが終了したことを確認するには、join()を使用してください。

WriteThread a = new WriteThread('a');
WriteThread b = new WriteThread('b');
a.start(); 
b.start();
// do some other stuff
a.halt();
b.halt();
a.join();
b.join();
// a and b are guaranteed to have finished at this point
于 2013-02-26T01:58:19.220 に答える
0

「stop」変数を揮発性にすることに加えて、コードをより「スレッドセーフ」にするために、「stop」の同期get / setメソッドを追加し、それらを使用する必要があります(whileループでは「get」、「」内では「set」停止」メソッド)。

それでも、「停止」後にスレッドが停止するという保証はありませんが、おそらく「印刷」が少なくなります。

このような保証を得るには、「a.halt()」を呼び出すスレッドが「a」スレッドに「while」ループを停止するように通知するように、セマフォなどのある種の「スレッド同期」メカニズムを使用する必要があります。「while」ループが効果的に終了し、セマフォを「解放」するまで(停止内で)停止します(したがって、呼び出し元のスレッドは実行を継続します)。

于 2013-02-26T01:17:30.160 に答える