2010-04-25 12 views
6

जावा स्रोतों से, यह देशी कोड में गिरने जैसा लगता है। क्या लागत लगभग अस्थिर पढ़ने के बराबर है या क्या इसे किसी प्रकार का लॉक प्राप्त करने की आवश्यकता है?Thread.isInterrupted() को कॉल करने की प्रदर्शन लागत क्या है?

+1

मैं मूल कोड का मानना ​​है, भी खुला स्रोत है के लिए, ताकि आप केवल जांच कर सकते हैं कि वहाँ क्या चल रहा है। – pajton

उत्तर

5

Thread.isInterrupted() कॉल करने के लिए एक बहुत ही सस्ता काम है। कुछ और संकेत हैं लेकिन सभी कॉल पर्याप्त तेज़ हैं। संक्षेप में:

यह जावा डबल अविवेक Thread::current()->_osthread->_interrupted प्रदर्शन से Thread.currentThread().isInterrupted() का अनुकरण करने के लिए संभव होना चाहिए।

Source:

bool os::is_interrupted(Thread* thread, bool clear_interrupted) { 
    assert(Thread::current() == thread || Threads_lock->owned_by_self(), 
    "possibility of dangling Thread pointer"); 

    OSThread* osthread = thread->osthread(); 

    bool interrupted = osthread->interrupted(); 

    if (interrupted && clear_interrupted) { 
    osthread->set_interrupted(false); 
    // consider thread->_SleepEvent->reset() ... optional optimization 
    } 

    return interrupted; 
} 

OSThread इस तरह कार्यान्वित किया जाता है:

volatile jint _interrupted;  // Thread.isInterrupted state 

// Note: _interrupted must be jint, so that Java intrinsics can access it. 
// The value stored there must be either 0 or 1. It must be possible 
// for Java to emulate Thread.currentThread().isInterrupted() by performing 
// the double indirection Thread::current()->_osthread->_interrupted. 
.... 
volatile bool interrupted() const     { return _interrupted != 0; } 
0

विधि isInterrupted का उपयोग यह जांचने के लिए किया जाता है कि थ्रेड बाधित है या नहीं और यह प्रदर्शन को प्रभावित नहीं करता है। अगर थ्रेड पहले ही बाधित हो गया था, तो यह रीसेट नहीं होता है। इसके अलावा निम्न लिंक देखें: link text

link text

1

मैं नहीं पता है कि क्या यह एक लॉक या नहीं प्राप्त कर लेता है, लेकिन मैं एक त्वरित परीक्षण भाग गया और मेरे लिए isInterrupted() मोटे तौर पर 100 बार एक अस्थिर चर पढ़ने की तुलना में धीमी । अब चाहे वह आपके आवेदन में मायने रखता है या नहीं, मैं आपको नहीं बता सकता।

+0

क्या आप उस बेंचमार्क को पोस्ट कर सकते हैं जिसका आपने उपयोग किया था? –

+0

@ माइकल: मैंने बहुत क्रूड परीक्षण किया था। असल में बस कुछ मिलियन बार लूपिंग और लूप कॉलिंग में पहले टेस्ट के लिए अवरुद्ध() है, और दूसरे के लिए चर पढ़ने। कोई अन्य धागे शामिल नहीं है। मैंने मूल्य का संदर्भ भी रखा ताकि लूप को अनुकूलित नहीं किया जा सके। – JRL

+0

माइक्रो-बेंचमार्क से सावधान रहें! खासकर एक जेवीएम पर। ऐसे कई कारक हैं जो परिणामों को आसानी से छोड़ सकते हैं। ऐसा करने के लिए आदर्श बात यह है कि इसे अपने आवेदन में लागू करें और इसे वास्तविक के लिए जांचें। Http://www.ibm.com/developerworks/java/library/j-jtp02225.html पर अधिक जानकारी। – mdma

संबंधित मुद्दे