我正在尝试学习 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;
}
}
}
}