Здравствуйте, Yodo, Вы писали:
Y>Нужно в Java получить периодические тики с точностью 0.001-0.01 ms
Java тут не сильно к лесу. OS этого не позволяет.
Y>На каждый тик из пула берется поток и выполняет переданную ему работу типа ThreadPool паттерн.
Y>Такую точность можно получить в C из native кода, используя callbacks ядра Linux: http://www.ibm.com/developerworks/linux/library/l-timers-list/index.html
Че-то не вижу там про 1-10us.
Y>Вопросы:
Y>1. Можно ли прокинуть эти callbacks в java через JNI?
Y>2. Если да, то в каком/каких потоках(threads) будет приходить этот callback?
Y>3. Решит ли это поставленную задачу?
можно вызвать из колбека, получив указатель на JNIEnv через JavaVM::AttachCurrentThread. Вызов, соответственно, будет в потоке колбека.
И следует помнить, что:
http://java.sun.com/docs/books/jni/html/other.html:
A JNIEnv pointer is only valid in the thread associated with it. You must not pass this pointer from one thread to another, or cache and use it in multiple threads. The Java virtual machine passes a native method the same JNIEnv pointer in consecutive invocations from the same thread, but passes different JNIEnv pointers when invoking that native method from different threads. Avoid the common mistake of caching the JNIEnv pointer of one thread and using the pointer in another thread.
Y>Пример кода:
Y>Все остальные способы получения точного таймера в java сводятся к Thread.sleep(), Thread.wait(), sleepNanos(), Lock.parkNanos() и пустым циклам.
Y>В случае торможениz потоков, время их пробуждения зависит от частоты (например HZ=250, время пробуждения будет около 4 ms). Т.е. максимальная точность будет 4 ms для HZ=250 и 1ms для HZ=1000. При нагрузке она ухудшится.
При нагрузке на что? А если поток присобачить к ядру?
Y>В случае с пустыми циклами, точность будет хорошая, но CPU будет утилизироваться на 90%.
Y>Еще вариант, выставить HZ=1000 и выделить ядро для одного процесса, который будет в одном потоке крутить таймер, потом дергать как-то java,
Y>например локально через UDP.
Эту идею ваще не понял. А ява что будет делать пока ждет пакета?
Немного позанудствую. Зачем все это танцы на простой JMV и простой OS? Возможно, что у вас даже HPET-а нет. Такие вещи надо на real-time os и real-time java, там проблем не будет.
Вы на С пробовали эти колбеки пробовали? Что получается?
Кстати, подумалось, вы попробуйте погонять еще jhuccup, так, чтобы посмотреть насколько можно на OS положиться.