मैं CodeReview में कुछ से कुछ सिफारिशों के बाद जावा से C # पर स्विच कर रहा हूं। इसलिए, जब मैं 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>
।
मेरा प्रश्न यह है कि क्या उन दोनों में कोई अंतर है, शब्दार्थ रूप से या अन्यथा - और यदि हां, तो यह क्या है, इसलिए मैं इसका पालन कर सकता हूं?