Синхронизация потоков в реальном времени с обычными потоками

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

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

3 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам