繁体   English   中英

如何从ScheduledExecutorService取回数据

[英]How to get data back from a 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;
  }

}

我会让Camera Feed成为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.");
    }

}

而且您在处理队列方面具有完全的灵活性。 您可以通过轮询队列直到其为空来获取最新图片,并知道是否自动有更多图片。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM