实时Java,第3部分 - 线程化和同步 - 编程入门网
个线程只有一个执行 for 循环的一个迭代。这个输出可通过考虑 RT 线程的优先级来解释。主 RT 线程一直运行,直至调用 Thread.sleep() 方法来阻塞线程。主 RT 线程创建了两个 RT 线程,但是只有第二个 RT 线程(具有第 6 RT 优先级)才能够在主 RT 线程休眠时运行。这个线程一直运行,直至主 RT 线程从休眠中苏醒并指示线程结束。主 RT 线程一旦结束,就允许执行具有第 6 优先级的线程并结束。程序按这种方式执行并打印具有非零值循环计数。此线程结束后,就允许运行具有第 4 RT 优先级的线程,但它只是绕过 for 循环,因为系统指示结束该线程。该线程将打印零循环计数值然后结束。
实时Java,第3部分 - 线程化和同步(7)时间:2011-06-22 Patrick Gallop MarkRT 应用程序的线程化考虑 移植应用程序以使用 RT 线程或编写新应用程序以利用 RT 线程化时需要考虑 RT 线程化的一些特性,本节将讨论这些特性。 RT 线程的新扩展 RTSJ 指定了一些工具,用于创建在某个特定或相关时间启动的 RT 线程。您可以创建一个线程,用于在指定的时间间隔或时期内运行某种逻辑。您可以定义一个线程,用于未在指定时期内完成此逻辑时执行(激发)一个 AsynchronousEventHandler(AEH)。您还可以定义线程所能够使用的内存类型和数量的限制,如果超过该限制,则抛出 OutOfMemoryError。这些工具只对 RT 线程可用,而对普通 Java 线程不可用。您可以在 RTSJ 中找到关于这些工具的更多信息。 Thread.interrupt() 和 pending 异常 RT 线程扩展了 Thread.interrupt() 行为。此 API 会像 JLS 中描述的那样中断被阻塞的进程。如果用户在方法声明中加入 Throws AsynchronouslyInterruptedException 子句,显式地将其标记为可中断,也会引起这个异常。该异常也会困扰 线程,用户必须显式地清除异常;否则它会一直困扰(术语为 pending)线程。如果用户不清除异常,则线程会伴随着该异常而结束。如果线程以 “常规” 形式结束,但是不是在按自身形式进行 RT 线程入池的应用程序中,这种错误危害不大,就是说,线程返回池中时仍然随附 InterruptedException。在这种情况下,执行线程入池的代码应显式地清除异常;否则,当重新分配具有随附异常的入池线程时,可能欺骗性地抛出异常。 原始线程和应用程序调度逻辑 原始线程通常都是普通 Java 线程 —— 而不是 RT 线程。第一个 RT 线程总是由普通 Java 线程创建。如果没有足够的可用处理器来同时运行 RT 线程和普通 Java 线程,则这个 RT 线程会立即抢占普通 Java 线程。抢占可以防止普通 Java 线程继续创建 RT 线程或其他逻辑,以便将应用程序置于适当的初始化状态。 您可以通过从一个高优先级 RT 线程执行应用程序初始化来避免这个问题。执行自身形式的线程入池和线程调度的应用程序或库可能需要这种技术。即,线程调度逻辑应该以高优先级运行,或在高优先级的线程中运行。为执行线程入池逻辑选择适当的优先级有助于防止线程入队和出队中遇到的问题。 失控线程 普通 Java 线程按时间量执行,而动态优先级根据 CPU 的使用调整调度程序的执行,允许所有的普通 Java 线程最后执行。反过来,RT 线程不受时间量的限制,并且线程调度程序不根据 CPU 的使用进行任何形式的动态优先级调整。普通 Java 线程和 RT 线程之间的调度策略差异使失控 RT 线程的出现成为可能。失控 RT 线程可以控制系统并阻止所有其他应用程序的运行,阻止用户登录系统等等。 在开发和测试期间,有一种技术可以帮助减轻失控线程的影响,即限制进程能够使用的 CPU 数量。在 Linux 上,限制 CPU 的使用使进程在耗尽 CPU 限制时终止失控线程。另外,监控系统状态或提供系统登录的程序应该以高 RT 优先级运行, |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |