High resolution timer Java Linux
От: Yodo  
Дата: 10.05.12 19:45
Оценка:
Нужно в Java получить периодические тики с точностью 0.001-0.01 ms
На каждый тик из пула берется поток и выполняет переданную ему работу типа ThreadPool паттерн.

Такую точность можно получить в C из native кода, используя callbacks ядра Linux: http://www.ibm.com/developerworks/linux/library/l-timers-list/index.html
Вопросы:
1. Можно ли прокинуть эти callbacks в java через JNI?
2. Если да, то в каком/каких потоках(threads) будет приходить этот callback?
3. Решит ли это поставленную задачу?

Пример кода:

class HRTimer{

private List<IHRTimerListener> listeners = new ArrayList<IHRTimerListener>();

public void addListener(IHRTimerListener listener){
listeners.add(listener);
}

//Этот метод должен вызываться из native кода на C
public void fire(){
for (IHRTimerListener listener: listeners){
fire();
}
}

}

Все остальные способы получения точного таймера в java сводятся к Thread.sleep(), Thread.wait(), sleepNanos(), Lock.parkNanos() и пустым циклам.
В случае торможениz потоков, время их пробуждения зависит от частоты (например HZ=250, время пробуждения будет около 4 ms). Т.е. максимальная точность будет 4 ms для HZ=250 и 1ms для HZ=1000. При нагрузке она ухудшится.
В случае с пустыми циклами, точность будет хорошая, но CPU будет утилизироваться на 90%.

Еще вариант, выставить HZ=1000 и выделить ядро для одного процесса, который будет в одном потоке крутить таймер, потом дергать как-то java, например локально через UDP.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.