私は Java 同時実行 API を学習しようとしています。私の演習では、ジョブを X 秒ごとに定期的に実行するようにスケジュールしたいと考えています。ジョブは乱数を計算します。
スケジュールされたタスクが終了したらすぐに結果を取得したい。API だけではこれを行うことができなかったので、ハックしました。
低レベルのメカニズムを使用せずに、これをより適切に行う方法はありますか? の同期を削除してMyRandomGiverTask.getResult()
、代わりに のようなものを使用できるようにしたいと考えていScheduledFuture.get()
ます。しかし、私のコードでは、ScheduledFuture は完了/完了していません。これは私の現在の解決策です:
class A {
public static void main() {
MyRandomGiverTask task = new MyRandomGiverTask(200);
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledFuture<Double> scheduledDouble =
(ScheduledFuture<Double>) scheduler
.scheduleAtFixedRate(task, 1, 4, TimeUnit.SECONDS);
while (true) {
System.out.println(" >> " + task.getResult());
}
}
public class MyRandomGiverTask implements Runnable {
MyRandomGiver giver = new MyRandomGiver();
int param;
double result;
public MyRandomGiverTask(int param) { this.param = param; }
@Override public void run() { result = giver.getRandom(param); }
public double getResult() {
try {
while (result == 0d) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return result;
} finally {
result = 0d;
}
}
}
}