2017-09-22 4 views
0

私はScheduledExecutorServiceを使用し、タスクが遅れて実行されるという単純な例があります。私はこれが私のカメラオブジェクトから戻ってきたデータに良い方法であるかどうかを知りたいと思います。ScheduledExecutorServiceからデータを取得する方法

public class App { 

    private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    private final Camera camera = new Camera(); 

    private Object lastPicture; 

    public static void main(String[] args) { 
    App app = new App(); 
    app.takePicture(); 

    // getLatestPicture when I need it on my frontend, in the future. (so image that this part can get called anytime). 
    // I also want to check if this picture is not the same as the last. (I might call getLastPicture multiple times within the second.) 
    Object currentPicture = app.getLastPicture(); 
    if (lastPicture == currentPicture) { 
     System.out.println("Same picture"); 
    } 
    System.out.println(currentPicture); 
    } 

    private void takePicture() { 
    executorService 
     .scheduleWithFixedDelay(takePictureTask(), 0, 1000, TimeUnit.MILLISECONDS); 
    } 

    private Runnable takePictureTask() { 
    return() -> camera.takePicture(); 
    } 

    public Object getLatestPicture() { 
    return camera.getPicture(); 
    } 

} 

カメラは: - おそらくのでMovieCamera作る

public class Camera { 

    private Object picture; 

    public void takePicture() { 
    System.out.println("Taking picture..."); 

    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    picture = new Object(); 

    System.out.println("Finished taking picture."); 
    } 

    public Object getPicture() { 
    return picture; 
    } 

} 
+0

これは、「呼び出し可能」がhttps://blogs.oracle.com/corejavatechtips/using-callable-to-return-results-from-runnablesのためのものです – Oleg

+0

'scheduleWithFixedDelay'と' scheduleAtFixedRate'は 'Callable 'param、それは実行される特定のタスクではないためです。 –

+0

これはあなたの質問から明らかではありませんでした。あなたは 'ピクチャ'を揮発性にする必要があり、その後は正常です。 – Oleg

答えて

0

私はCameraフィードBlockingQueueになるだろう。

private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    private final BlockingQueue<Object> pictures = new ArrayBlockingQueue<>(); 
    private final Camera camera = new Camera(pictures); 

次に、画像を保存するのではなく、キューにフィードを送ることができます。

public static class Camera { 
    private final BlockingQueue<Object> pictureQueue; 

    public Camera(BlockingQueue<Object> pictureQueue) { 
     this.pictureQueue = pictureQueue; 
    } 

    public void takePicture() { 
     System.out.println("Taking picture..."); 

     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     pictureQueue.put(new Object()); 

     System.out.println("Finished taking picture."); 
    } 

} 

そして、キューの処理には完全な柔軟性があります。キューが空になるまで待ち行列をポーリングし、自動的に写真がさらにあるかどうかを知ることで、最新の写真を取得できます。

+0

うん。あなたは私をより良い道に導きました。 java.util.concurrentパッケージ内のデータ構造を調べます。 –

関連する問題