2015-04-29 3 views
0

Я занимаюсь некоторыми вопросами о том, как что-то делать через определенный промежуток времени (например, печатать привет мир каждые пять секунд).Повторите что-нибудь через определенный промежуток времени

Я видел разные способы, которыми мы можем это сделать в программе java. мой вопрос в том, как java делает это внутри.

Как только мы запускаем программу java, основная функция запускается в потоке. Но этот поток можно отправить в состояние Runnable в любое время (приостановить выполнение). Поэтому, если бы я указал оператор print в основной функции, как теперь java отслеживает время. что, если программа Java не возобновилась в течение следующих пяти секунд?

Один из способов, которым это может сработать, - это если мы имели в виду «каждые 5 секунд в течение периода времени, в течение которого программа java работает». Так ли это делает JVM?

Предположим, что у меня есть один процессор.

+0

Он просит ОС разбудить его через 5 секунд. – immibis

+0

- это поведение гарантировано? будет ли ОС разбудить его через 5 секунд? – DesirePRG

+0

Нет, ОС не гарантирует разбудить ваш процесс или поток через пять секунд. Единственные ОС, которые на самом деле дают такие гарантии, - это жесткие ОС RealTime: es. Даже мягкий RT гарантирует, что вы просыпаетесь ровно через пять секунд. –

ответ

0

Хорошо, проследите вызовы. Если мы используем ScheduledThreadPoolExecutor мы можем обнаружить, что он использует DelayedWorkQueue внутренне:

super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, 
      new DelayedWorkQueue()); 

Ждать следующие задачи DelayedWorkQueue использует Condition available = lock.newCondition():

available.awaitNanos(delay); 

Хорошо, давайте посмотрим на awaitNanos реализациях в AbstractQueuedSynchronizer:

LockSupport.parkNanos(this, nanosTimeout); 

И LockSUpport:

unsafe.park(false, nanos); 

Это собственный метод, который использует планировщик операционных систем для замедления выполнения потоков.

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