ฉันเปลี่ยนมาใช้ Java จาก C # หลังจากได้รับคำแนะนำจาก CodeReview ดังนั้นเมื่อฉันมองไปที่ LWJGL สิ่งหนึ่งที่ฉันจำได้ก็คือทุกการเรียกจะDisplayต้องดำเนินการในเธรดเดียวกันกับDisplay.create()วิธีที่เรียกใช้ เมื่อนึกถึงสิ่งนี้ฉันได้สร้างคลาสที่มีลักษณะเช่นนี้ขึ้นมา
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());
}
}
ในขณะที่เขียนระดับนี้คุณจะสังเกตเห็นว่าฉันสร้างวิธีการที่เรียกว่าผลตอบแทนisClosed() Future<Boolean>ยื้อนี้ฟังก์ชั่นของฉันSchedulerอินเตอร์เฟซ (ซึ่งเป็นอะไรมากไปกว่าห่อหุ้มรอบยScheduledExecutorService. ในขณะที่เขียนscheduleวิธีการเกี่ยวกับการSchedulerที่ผมสังเกตเห็นว่าผมทั้งสามารถใช้Supplier<T>การโต้แย้งหรือCallable<T>โต้แย้งเพื่อเป็นตัวแทนของฟังก์ชั่นที่ถูกส่งผ่านใน. ScheduledExecutorServiceไม่ได้มี แทนที่สำหรับSupplier<T>แต่ผมสังเกตเห็นว่าการแสดงออกแลมบ์ดา() -> Display.isCloseRequested()เป็นจริงพิมพ์เข้ากันได้กับทั้งสองและCallable<bool> Supplier<bool>
คำถามของฉันคือมีความแตกต่างระหว่างสองคนนี้มีความหมายหรืออย่างอื่น - และถ้าเป็นเช่นนั้นมันคืออะไรดังนั้นฉันสามารถปฏิบัติตามมันได้หรือไม่