Нужно в 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.