ジュリア集合を計算するプログラムを実装しています。使用可能なプロセッサの数に応じて、複数のスレッドが使用されます。各スレッドは行を計算しますが、その行が別のスレッドによって計算されていない場合のみです。この部分はかなりうまく機能します。
しかし、より大きな画像でテストする場合があります(たとえば、 の代わりに計算する行が多くgetHeight() = 1200
、 に設定すると3000
、スキップされる行がいくつかあります)。行が 2 回計算されたり、行がスキップされたりしないように、より安全にしたいと考えています。run()
メソッドのコードは次のとおりです。
public void run() {
while (counter < getHeight()-1) {
synchronized(this) {
if (counter >= getHeight() -1) { //so that the last line will not be calculated >2 times.
return;
}
counter++;
image.setRGB(0, counter, getWidth(), 1, renderLine(counter), 0, 0);
}
}
}
私はそれがそのように動作することを望みます:現在の行が計算されている場合、スレッドは次の行に進みます..混乱することなく、行がスキップされます..
私は実際にこれを試しています:
public void run() {
while (counter < getHeight()-1 && !working) {
synchronized(this) {
working = true;
if (counter >= getHeight() -1) { //so that the last line will not be calculated >2 times.
return;
}
counter++;
image.setRGB(0, counter, getWidth(), 1, renderLine(counter), 0, 0);
working = false;
}
}
}
しかし、スレッドがすでに動作している間に別のスレッドへのアクセスが妨げられるかどうかはわかりません。また、「カウンター」の値が変更されるため、行をスキップできます。
スレッドが実際に回線で動作していることを通知するためにブール変数が必要ですか? 何かアドバイス?