1

スレッドの実行を制御する変数 にはvolatile必須ですか?kill

public class MyThread extends Thread{  

  private boolean kill = false;  

  public void killThread(){  
      kill = true;  
  }  

  @Override  
  public void run(){  
     while(!kill){  
                 //do stuff  
     }  
  }  

}  

たとえば、コードの他の部分 (別のスレッド) でtheThreadRef.killThread();、スレッドが停止することを期待する必要がありますか、またはとして宣言されていないために結果が予測できません? メソッドを介して更新するため、これについてはわかりません。 ありがとう killvolatilekillkillThread

4

2 に答える 2

9

はい、killスレッド間で共有される変数であり、 である必要がありますvolatile。ただし、必要なものを実現するために、 と をThread.interrupt()含むJava のネイティブの割り込みメカニズムを使用することを検討してください。Thread.interrupted()その後、独自の変数を保持する必要はありません。

于 2012-07-31T08:09:57.803 に答える
0

はい。killとして宣言しない場合volatile、別のスレッドが新しい割り当てを行った後、他のスレッドが古い値を読み取り続ける可能性があります。値が更新されるタイミングまたは更新されるかどうかは定義されていないため、その意味での動作は予測できません(実際には、新しい割り当てが最終的に表示されます)。

ただし、プリミティブブール値の割り当てはアトミックであるため、値は常に「適切/有効な」値になります(つまりtruefalse無効な値になることはありません)。したがって、その意味で、動作は完全に予測不可能ではありません(コードがクラッシュしないなど)。これは、long型や非プリミティブオブジェクトには当てはまらないことに注意してください。プリミティブint型もプリミティブブール値と同じプロパティを持っており、これは標準ライブラリのStringクラス実装でハッシュコード計算を最適化するためによく使用されます。

于 2012-07-31T08:28:45.050 に答える