Tôi đã chuyển sang Java từ C # sau một số đề xuất từ một số tại CodeReview. Vì vậy, khi tôi đang tìm hiểu về LWJGL, một điều tôi nhớ là mọi lệnh gọi Displayphải được thực hiện trên cùng một luồng mà Display.create()phương thức được gọi. Nhớ điều này, tôi đã đánh một lớp trông giống như thế này.
public class LwjglDisplayWindow implements DisplayWindow {
private final static int TargetFramesPerSecond = 60;
private final Scheduler _scheduler;
public LwjglDisplayWindow(Scheduler displayScheduler, DisplayMode displayMode) throws LWJGLException {
_scheduler = displayScheduler;
Display.setDisplayMode(displayMode);
Display.create();
}
public void dispose() {
Display.destroy();
}
@Override
public int getTargetFramesPerSecond() { return TargetFramesPerSecond; }
@Override
public Future<Boolean> isClosed() {
return _scheduler.schedule(() -> Display.isCloseRequested());
}
}
Trong khi viết lớp này, bạn sẽ nhận thấy rằng tôi đã tạo ra một phương pháp gọi isClosed()là lợi nhuận một Future<Boolean>. Điều này gửi một hàm đến Schedulergiao diện của tôi (không gì khác hơn là một trình bao bọc xung quanh ScheduledExecutorService. Trong khi viết schedulephương thức trên Schedulertôi nhận thấy rằng tôi có thể sử dụng một Supplier<T>đối số hoặc một Callable<T>đối số để biểu diễn hàm được truyền vào. ScheduledExecutorServiceKhông chứa ghi đè cho Supplier<T>nhưng tôi nhận thấy rằng biểu thức lambda () -> Display.isCloseRequested()thực sự là loại tương thích với cả Callable<bool> và Supplier<bool> .
Câu hỏi của tôi là, có sự khác biệt giữa hai thứ đó, về mặt ngữ nghĩa hay mặt khác - và nếu vậy, nó là gì, để tôi có thể tuân thủ nó?