0

我正在嘗試學習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; 
    } 
} 

回答

1

如果你想獲得計算的每個隨機數,使用BlockingQueue。計劃任務put()是隊列中的新隨機數,以及他們想要的任何東西。

另外,如果你要使用像您的解決方案,你會想用wait()/notify(),不sleep()

7

你的任務是安排在固定利率。這意味着,除非您取消任務,否則執行人員將以固定費率一次又一次執行該任務。這樣的任務能做的唯一的事情是有一個副作用。它不能返回任何東西,因爲執行程序返回的未來表示任務的所有未決執行。順便說一句,你會注意到schedule方法採用Callable作爲參數(這可能會導致某些內容),而sceduleAtFixedRate方法僅將Runnable作爲參數(返回void,因此不能返回任何內容)。因此,如果你想打印每個執行的結果,那麼簡單地讓任務本身(Runnable)打印它的結果,或者讓runnable把它的結果放到阻塞隊列中,並且從主線程take隊列。因此主線程會被阻塞,某些結果被放入隊列中。

+0

如果您正在等待結果,您通常不希望在循環中進行輪詢,您只需使用take。 – jtahlborn 2012-01-15 13:31:53

+0

好點。我確定了我的答案。我不配合民意調查和採取。 – 2012-01-15 13:34:22