使用实时Java进行开发,第2部分 改善服务质量 - 编程入门网
)可以提供大大改进的线程行为。在对标准 Java 语言和 VM 规范的增强中,RTSJ 引入了两类新的线程 RealtimeThread 和 NoHeapRealtimeThread,它们的定义比标准 Java 线程模型要严格得多。这些线程类型提供了真正基于抢占优先级的调度机制:如果需要执行高优先级任务并且处理器核心上目前计划执行一个较低优先级任务,那么该较低优先级任务将被抢占,以便高优先级任务可以执行。
大部分实时 OS 都能够在数十微秒内执行这种抢占机制,这仅会影响到具有极高的计时需求的应用程序。两种新线程类型都是用 FIFO(先进先出)调度策略,而不是在大部分 OS 上运行的 JVM 所使用的熟悉的循环调度策略。循环调度和 FIFO 调度策略之间最明显的区别在于,在具有相同优先级的线程中,一旦计划让一个线程继续执行,那么它只有在遇到阻塞或资源释放处理器时才会停止。此模型的优点在于,执行特定任务的时间更加容易预测,因为处理器不是共享的,即使有多个具有相同优先级的任务。出于此原因,如果您可以通过消除同步和 I/O 优先级来使线程不受阻塞,在线程启动之后,OS 将不会干预它。但是,在实际中,消除所有同步非常困难,所以很难为实际任务实现这种理想目标。尽管如此,FIFO 调度机制为尝试减少延迟的应用程序设计师提供了一项重要帮助。 您可以将 RTSJ 想作一个大型工具箱,它可以帮助您设计具有实时行为的应用程序,您可以仅使用两三个工具,或者可以重新编写应用程序来提供高度可预测的性能。修改应用程序来使用 RealtimeThread 通常不会很困难,甚至可以在不访问实时 JVM 来编译 Java 代码的情况下实现这一点,但是请小心使用 Java 反射服务。 但是,要利用 FIFO 调度机制的易变性优势,可能需要进一步更改您的应用程序。FIFO 调度的工作方式与循环调度不同,这些区别可能导致一些 Java 程序挂起。例如,如果应用程序依赖于 Thread.yield() 来允许其他线程在核心上运行(这种技术经常用于在不使用整个核心的情况下轮询某个条件),那么预期的效果将不会发生,因为使用 FIFO 调度机制,Thread.yield() 不会阻塞当前线程。由于当前线程仍然是可调度的,并且它位于 OS 内核中的调度队列的最前面,所以它将继续执行。因此,意图提供对 CPU 资源的公平访问(等待某个条件变为真)的编码模式实际上将消耗运行它的整个 CPU 核心。而这是最可能的结果。如果需要设置此条件的线程具有较低的优先级,那么它可能始终不能访问核心来设置条件。在如今的多核处理器中,这种问题可能很少发生,但是它强调您需要谨慎考虑在采用 RealtimeThread 线程时使用哪些优先级。最安全的方法是让所有线程使用一个优先级值,不使用 Thread.yield() 和将消耗整个 CPU(因为它们不会被阻塞)的其他类型的自旋循环。当然,充分利用可用于 RealtimeThread 的优先级值将最容易满足服务质量目标。(关于在应用程序中使用 RealtimeThread 的更多技巧,请参阅 “实时 Java,第 3 部分: 线程化和同步。”) 使用实时Java进行开发,第2部分 改善服务质量(5)时间:2011-01-27 IBM Mark StoodleyJava 服务器示例 在本文剩余部分,我们将应用在前面章节中介绍的一些想法,使用 Java 类库中的 Executors 服务构建一个相对简单的 Java 服务器应用程序。只需少量应用程序代码,Executors 服务就可以用于创建一个服务器来管理工作者线程池,如清单 5 所示: 清单 5. 使用 Executors 服务的 Server 和 TaskHandler 类
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |