如何从ScheduledExecutorService获取数据

时间:2017-09-22 08:44:59

标签: java 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();
  }

}

相机

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;
  }

}

1 个答案:

答案 0 :(得分:0)

我会Camera提供BlockingQueue - 因此可能会将其设为MovieCamera

    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.");
    }

}

您可以完全灵活地处理队列。你可以通过轮询队列直到它是空的来获得最新的图片,并知道是否有更多的图片自动。

相关问题