Saya telah beralih ke Java dari C # setelah beberapa rekomendasi dari beberapa di CodeReview. Jadi, ketika saya melihat ke LWJGL, satu hal yang saya ingat adalah bahwa setiap panggilan Display
harus dieksekusi pada utas yang sama dengan Display.create()
metode yang digunakan. Mengingat ini, saya menyiapkan kelas yang terlihat seperti ini.
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());
}
}
Saat menulis kelas ini Anda akan melihat bahwa saya membuat metode yang disebut isClosed()
yang mengembalikan a Future<Boolean>
. Ini kiriman fungsi untuk saya Scheduler
antarmuka (yang tidak lebih dari pembungkus di sekitar ScheduledExecutorService
. Sementara menulis schedule
metode pada Scheduler
aku menyadari bahwa aku baik bisa menggunakan Supplier<T>
argumen atau sebuah Callable<T>
argumen untuk mewakili fungsi yang dilewatkan dalam. ScheduledExecutorService
Tidak mengandung ganti untuk Supplier<T>
tetapi saya perhatikan bahwa ekspresi lambda () -> Display.isCloseRequested()
sebenarnya adalah tipe yang kompatibel dengan keduanya Callable<bool>
dan Supplier<bool>
.
Pertanyaan saya adalah, apakah ada perbedaan antara keduanya, secara semantik atau sebaliknya - dan jika demikian, apa itu, sehingga saya dapat mematuhinya?