2010-04-25 3 views
6

Из источников java, похоже, что он попадает в собственный код. Является ли стоимость примерно эквивалентной показателю волатильности или ему нужно приобрести блокировку какого-либо типа?Какова стоимость исполнения вызова Thread.isInterrupted()?

+1

Я считаю, что нативный код является открытым исходным кодом, так что вы можете просто проверить, что там происходит. – pajton

ответ

5

Thread.isInterrupted() - очень дешевая функция для вызова. Там еще несколько указаний, но все звонки достаточно быстры. Подводя итог:

Должна быть обеспечена возможность для Java подражать Thread.currentThread().isInterrupted() выполняя двойной косвенность Thread::current()->_osthread->_interrupted.

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

@ Майкл: Я провел очень грубое тестирование. В основном просто цикл за несколько миллионов раз и в вызове цикла isInterrupted() для первого теста и чтение переменной для второго. Никаких других потоков. Я также сохранил ссылку на значение, поэтому цикл не будет оптимизирован. – JRL

+0

Остерегайтесь микро-тестов! Особенно на JVM. Есть много факторов, которые могут легко исказить результаты. Идеальная вещь - это реализовать это в своем приложении и проверить его на самом деле. Подробнее см. На странице http://www.ibm.com/developerworks/java/library/j-jtp02225.html. – mdma

Смежные вопросы