J'ai un exemple simple où j'utilise un ScheduledExecutorService
et exécute une tâche à retardement. Je voudrais savoir si c'est un bon moyen de récupérer les données de mon objet caméra.Comment récupérer des données à partir d'un 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();
}
}
Caméra:
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;
}
}
C'est ce que 'Callable' est pour https://blogs.oracle.com/corejavatechtips/using-callable-to-return-results-from-runnables – Oleg
' scheduleWithFixedDelay' et 'scheduleAtFixedRate' ne prend pas de' Callable 'param, car ce n'est pas une tâche spécifique qui est exécutée. –
Droit, ce n'était pas clair à partir de votre question. Vous devez rendre 'picture' volatile et alors tout ira bien. – Oleg