Синхронизация потоков в реальном времени с обычными потоками - PullRequest
6 голосов
/ 14 февраля 2009

Как можно синхронизировать один поток в реальном времени с обычным потоком в Java? Возьмем, например, поток в реальном времени, который вычисляет некоторые температуры, и поток GUI, который должен собирать эти числа и отображать их на некоторых элементах управления.

Реализация библиотеки реального времени не должна иметь значения, поскольку она должна соответствовать спецификациям.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2009

Тебе понадобятся две вещи. Вы хотите, чтобы ваш поток в реальном времени получал приоритет, и желательно, чтобы он управлялся таймером, чтобы вы получали (почти) периодические измерения. Затем вам понадобится ресурс, который можно использовать для передачи значений. Это может быть либо простой монитор с критическим разделом, чтобы поток таймера мог записывать в него, либо он может быть - и, скорее всего, лучше - как FIFO, чтобы поток GUI мог поглощать значения всякий раз, когда имеет циклы.

В Java GUI (по крайней мере, в Swing и аналогичных) уже запускает отдельный поток для взаимодействий с пользовательским интерфейсом, поэтому большая проблема заключается в настройке потока измерений. Взгляните на Runnables.

2 голосов
/ 10 апреля 2009

Поскольку другие используют RTSJ, я прокомментирую, что синхронизация между кодом в реальном времени и не в реальном времени имеет ряд решений. RTSJ предоставляет очередей без ожидания для такой связи. Можно также использовать эти или другие очереди и использовать абстракции AsyncEvent и AsyncEventHandler RTSJ для управления связью. Это подходит для ситуаций, когда вы действительно нуждаетесь в детерминированном поведении потока «в реальном времени».

Если вы можете принять поведение с максимальными усилиями (изо всех сил старайтесь уложиться в сроки, но мир не развалится, если вы пропустите), я предлагаю тщательно опираться на среду executor, предоставляемую утилитами параллелизма Java . Тщательный выбор границ задач, подходящая политика очередей (здесь «подходящая» будет зависеть от более подробной информации о вашем приложении, чем вы указали) и политика пула потоков получат то, что вам нужно.

2 голосов
/ 14 февраля 2009

Чтобы использовать потоки в реальном времени, вам нужна Real Time Java в операционной системе реального времени. http://java.sun.com/javase/technologies/realtime/index.jsp

Однако, если у вас есть нить, чувствительная к задержке, я предлагаю вам;

  • использовать библиотеки параллелизма для связи с другими потоками.
  • свести к минимуму любую активность GC (особенно полный GC)
  • не запускайте поток в том же процессе, что и GUI, если можете (так как он имеет тенденцию захватывать много ресурсов способами, которыми вы ограничены)
...