2013-12-04 4 views
3

Я не мог узнать, как измерить время, в течение которого поток ожидает блокировки. Я должен определить, ждет ли поток Thread больше 1 секунды, и если это так, чтобы вместо этого запустить другой поток. Благодаря!Как измерить время ожидания потока?

+0

Почему вас это волнует, если он заблокирован? Если нить занимает более 1 секунды по любой причине, вы можете запустить другой поток, или вы можете использовать ExecutorService и позволить ему создавать потоки для вас. –

ответ

2

Попробуйте это:

long startTime = System.nanoTime(); 
methodToTime(); 
long endTime = System.nanoTime(); 

long duration = endTime - startTime; 
+0

@Combine Если это полезно для вас, пожалуйста, примите его в качестве правильного ответа .. :) –

+0

Я бы сделал это, но у меня нет кредитов, чтобы оценить или выбрать правильный ответ :) Рано или поздно я буду. ура – Combine

2

Время это с помощью Sytem.nanoTime(); до и после ожидания.

long start = System.nanoTime(); 
wait(); 
long time = System.nanoTime() - start; // nanos 

Или:

long start = System.nanoTime(); 
synchronized (objHere) 
{ 
    long time = System.nanoTime() - start; // nanos 
    // ... 
} 

Примечание: Если тема закрыта, планировщик будет продолжаться с другими потоками. Вам не нужно делать это вручную. Это идея потоков. Может быть, вы столкнулись с deadlock? Википедия говорит, что это красиво:

Тупик - это ситуация, при которой два или более конкурирующих действия ждут другого, и никто этого не сделает.

0

Как правило, методы, действующие на блокировки, принимают таймаут в качестве аргумента. Если вы используете wait(), вы можете указать количество времени, пройдя время ожидания в качестве аргумента. Подробнее читайте здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait%28long%29.

Если вы используете блокировку, попробуйте метод tryLock, который принимает время, которое он должен ждать. Проверьте этот учебник для идеи: http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

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