हाल ही में मैंने एक बहुत ही बुनियादी कार्यक्रम बनाया है। एक समय काउंटर जिसमें रुकने की क्षमता है। यह 3 धागे, स्विंग के लिए 2 और मुख्य धागे के लिए 1 के साथ काम कर रहा था।जबकि (सच) लूप या java.util.Timer एक मानक प्रोग्राम पाश के लिए?
इस कार्यक्रम के लिए मुख्य धागे में एक डेल्टा समय गिनती हिस्सा होना चाहिए। मैंने इस तरह की एक बहुत ही बुनियादी प्रणाली बनाई;
while(true)
{
long now = System.currentTimeMillis();
if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}
sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;
sessionPrevMs = now;
sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}
उपरोक्त यह कोड उच्च CPU उपयोग के कारण हुआ। मैं तो साथ कि कोड हिस्सा लिया है:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
long now = System.currentTimeMillis();
if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}
sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;
sessionPrevMs = now;
sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}
}, 0, 1);
और समस्या चला गया था। मुझे बस इसका कारण आश्चर्य है। प्रोग्राम लूप बनाने का इष्टतम तरीका भी क्या है?
आपका 'जबकि (सत्य) 'लूप कोई रोक नहीं देता है, इसलिए लूप लगातार चल रहा है और लगातार सीपीयू खा रहा है। शेड्यूलिंग आपके 'रन' विधि को निष्पादित करती है, केवल तभी जब इसे निर्धारित किया जाता है। – Berger
तो अगर मैंने शेड्यूलर को 50 नैनोसेकंड प्रति बार एक बार कॉल किया है, तो क्या यह वही होगा?और फिर भी प्रोग्राम लूप बनाने का सबसे अच्छा तरीका क्या है? @ बर्गर – iGoodie
यह आपकी 'रन' विधि की अवधि पर निर्भर करता है, लेकिन 50 नैनोसेकंड वास्तव में कम है, क्या आपको ऐसी उच्च आवृत्ति की आवश्यकता है? हालांकि, जैसा कि आपने इसे देखा है, अपने एप्लिकेशन को सांस लेने देना बेहतर है, इसलिए या तो शेड्यूलर का उपयोग करें, या अपने 'जबकि' लूप में 'थ्रेड.sleep' जोड़ें। – Berger