我有一个简单的例子,我使用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;
}
}
答案 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.");
}
}
您可以完全灵活地处理队列。你可以通过轮询队列直到它是空的来获得最新的图片,并知道是否有更多的图片自动。