快速业务通道

实时Java,第3部分 - 线程化和同步 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
程调度程序必须从非空的最高优先级队列的头部开始调度。注意:如果所有队列中的线程都不具有 RT 优先级,则调度一个普通 Java 线程按 JLS 中的描述执行(参见 普通 Java 线程的线程调度)。

具有 RT 优先级的调度线程可以一直执行直至阻塞,通过让步自愿放弃控制权,或被具有更高 RT 优先级的线程抢占。具有 RT 优先级并自愿让步的线程的优先级被置于队列的后端。RTSJ 还要求此类调度在不变的时间内进行,并且不能随某些因素变化(如当前执行的 RT 线程的数量)。RTSJ 的 1.02 版本对单处理器系统应用了这些规则;RTSJ 对于多处理器系统上的调度如何运作未作要求。

Linux 为所有适当的 RTSJ 调度需求提供了 SCHED_FIFO 策略。SCHED_FIFO 策略用于 RT 而不用于用户任务。SCHED_FIFO 与 SCHED_OTHER 策略的区别在于前者提供了 99 个优先级级别。SCHED_FIFO 不为线程分时间片。同样,SCHED_FIFO 策略也不动态调整 RT 线程的优先级,除非通过优先级继承锁定策略(同步概述 一节对此作出了描述)。由于优先级继承的原因,RTSJ 需要使用优先级调整。

Linux 为 RT 线程和普通 Java 线程提供不变时间调度。在多处理器系统中,Linux 试图模拟分派到可用处理器的单个全局 RT 线程队列的行为。这与 RTSJ 的精神最为接近,但确实与用于普通 Java 线程的 SCHED_OTHER 策略不同。

实时Java,第3部分 - 线程化和同步(5)

时间:2011-06-22 Patrick Gallop Mark

使用 RT 线程的有问题的代码示例

清单 2 修改 清单 1 中的代码来创建 RT 线程而不是普通 Java 线程。使用 java.realtime.RealtimeThread 而不是 java.lang.Thread 指出了其中的区别。第一个线程创建于第 4 RT 优先级而第二个线程创建于第 6 RT 优先级,与 getPriorityMin() 方法确定的相同。

清单 2. RT 线程

import javax.realtime.*; class myRealtimeThreadClass extends javax.realtime.RealtimeThread {   volatile static boolean Stop = false;   // Primordial thread executes main()   public static void main(String args[]) throws InterruptedException {     // Create and start 2 threads     myRealtimeThreadClass thread1 = new myRealtimeThreadClass();     // want 1st thread at 4th real-time priority     thread1.setPriority(PriorityScheduler.getMinPriority(null)+ 4);     myRealtimeThreadClass thread2 = new myRealtimeThreadClass();     // want 2nd thread at 6th real-time priority     thread2.setPriority(PriorityScheduler.getMinPriority(null)+ 6);     thread1.start();      // start 1st thread to execute run()     thread2.start();      // start 2nd thread to execute run()     // Sleep for 5 seconds, then tell the threads to terminate     Thread.sleep(5*1000);     Stop = true;   }   public void run() { // Created threads execute this method     System.out.println("Created thread");     int count = 0;     for (;Stop != true;) {  // continue until asked to stop      count++;      // Thread.yield();  // yield to other thread     }     System.out.println("Thread terminates. Loop count is " + count);   } }

清单 2 中修改后的代码存在一些问题。如果程序在单处理器环境中运行,则它永远不会结束并且只能打印以下内容:

Created thread

出现这样的结果可以用 RT 线程调度的行为来解释。原始线程仍然是一个普通 Java 线程并利用非 RT(SCHED_OTHER)策略运行。只要原始

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号