ThreadPoolExecutor
でRunnableを実行し、このRunnableが共有状態を変更した場合、共有状態への変更が元のスレッドに表示されるかどうかは保証されますか?実行ファイルをプールに提出したのは?共有状態に1つのライターと1つのリーダーしかないと仮定します。 Future
を返すExecutorService
を使用すると、Future.get()
を実行すると可視性が保証されます。ThreadPoolExecutor.execute()でメモリの可視性を保証
class State {
private int x;
public State(int y) { x = y; }
public void setX(int y) { x = y; }
public int getX() { return x; }
}
main() {
threadPool = new ThreadPoolExecutor(8, 16, 100, TimeUnit.SECONDS, new ArrayBlockingQueue(...))
final State myState = new State(1);
threadPool.execute(new Runnable() {
public void run() {
myState.setX(50);
}
});
while (true) {
if (myState.getX() == 50) {
break;
}
sleep();
} // would this loop terminate?
}
ありがとうございます - これは私にとって理にかなっています。上記の私の例は実際には少し工夫されています。私が見た元のコードは、実際にはスレッドプールに非同期タスクの束をキックオフします。これらのタスクは、潜在的に一部の状態を更新する可能メインスレッドはちょうどタイトなループで状態をポーリングし、いくつかの作業を行います。タスクが完了するまで明示的に待つ必要はありません。これを反映するためにコードサンプルを編集します。 – Harish
シグネチャデバイスは、ある種の正常なスレッド間シグナリングデバイス(イベントのようなもの)を通して状態をポーリングすると、スレッドXがスレッドYのイベント/シグナルを参照すると、送信前にスレッドXが行ったメモリ変更を確認する可能性が高くなります信号または事象。偽装しないでください - 適切なシグナリング/同期デバイスを使用してください。 –