我正在嘗試學習java併發API,對於我的練習,我想安排一個作業每隔X秒週期運行一次。該工作將計算一個隨機數。獲取計劃任務的結果
我想在計劃任務完成後立即獲得結果。 我不能只用API來完成這個工作,所以我砍了它。
有沒有辦法更好地做到這一點,而不使用低級機制? 我希望能夠在MyRandomGiverTask.getResult()
中刪除同步,而使用 ,例如ScheduledFuture.get()
。但在我的代碼ScheduledFuture從來沒有完成/完成。 這是我目前的解決方案:
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 {
if (result == 0d) {
while (result == 0d) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return result;
} finally {
result = 0d;
}
}
如果您正在等待結果,您通常不希望在循環中進行輪詢,您只需使用take。 – jtahlborn 2012-01-15 13:31:53
好點。我確定了我的答案。我不配合民意調查和採取。 – 2012-01-15 13:34:22