[英]Get result of scheduled task
我正在嘗試學習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;
}
}
}
}
您的任務按固定速率安排。 這意味着在您取消任務之前,執行者將以固定的速率一次又一次地執行它。 這樣的任務唯一可以做的就是產生副作用。 它無法返回任何內容,因為執行者返回的future表示任務的所有未決執行。 順便說一句,您會注意到schedule
方法將Callable作為參數(可能會產生結果),而sceduleAtFixedRate
方法僅將Runnable作為參數(返回void,因此不能返回任何內容)。
因此,如果要打印每次執行的結果,則只需使任務本身(Runnable)打印其結果,或將runnable的結果放入阻塞隊列中,並使主線程從隊列中take
。 因此,主線程將被阻塞,直到某些結果放入隊列中為止。
如果要計算每個隨機數,請使用BlockingQueue。 計划任務put()
的新隨機數放入隊列中,並且希望它們執行的任何操作都可以take()
它們。
同樣,如果你要使用像你的解決方案,您可能需要使用wait()
/ notify()
不sleep()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.