簡體   English   中英

獲取預定任務的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM