与普通线程实时线程同步

时间:2009-02-14 00:32:25

标签: java synchronization real-time real-time-java

如何在Java中将一个实时线程与普通线程同步?例如,计算一些温度的实时线程和必须收集这些数字并在某些控件上显示它们的GUI线程。

实时库的实现应该无关紧要,因为它应该遵循规范。

3 个答案:

答案 0 :(得分:4)

你需要两件事。您希望实时线程获得优先级,并且最好由计时器驱动,以便(几乎)定期进行测量。然后,您将需要一个可用于传递值的资源。这可以是一个简单的监视器,有一个临界区,所以定时器线程可以写入它,或者它可能 - 并且很可能会更好 - 作为一个FIFO,这样GUI线程可以在任何时候吃掉它的值有周期。

在Java中,GUI(至少在Swing等中)已经为UI交互运行了一个单独的线程,因此您最大的问题是设置测量线程。看看Runnables。

答案 1 :(得分:2)

要使用实时线程,您需要在实时操作系统上使用Real Time Java。 http://java.sun.com/javase/technologies/realtime/index.jsp

但是如果你有一个对延迟敏感的线程,我建议你;

  • 在与其他线程的通信中使用并发库。
  • 最小化任何GC活动(特别是完整的GC)
  • 如果可以的话,不要在与GUI相同的进程中运行该线程(因为它倾向于以有限的方式获取大量资源)

答案 2 :(得分:2)

由于其他人提出了RTSJ,我将评论实时和非实时代码之间的同步有许多解决方案。 RTSJ为此类通信提供wait-free queues。也可以在这些或其他队列的基础上构建并利用RTSJ的AsyncEventAsyncEventHandler抽象来管理通信。这适用于您真正需要“实时”线程的确定性行为的情况。

如果你能接受尽力而为的行为(尽量努力达到你的最后期限,但如果你错过了世界不会崩溃)我建议仔细构建the Java concurrency utilities提供的执行者框架。仔细选择任务边界,一个合适的排队策略(这里,“合适”取决于你的应用程序的更多细节而不是你给出的),并且线程池策略将得到你需要的。