快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
线程启动第一个 RT 线程,RT 线程就抢占原始线程并且 RT 线程将会不确定地运行,因为它不受时间量和线程阻塞的限制。原始线程被抢占后,就再也不允许执行,因此再也不会启动第二个 RT 线程。Thread.yield() 对允许原始线程执行反而不起作用 —— 因为让步逻辑将 RT 线程置于其运行队列的末端 —— 但是线程调度程序将再次调度这个线程,因为它是运行队列前端的具有最高优先级的线程。

该程序在双处理器系统中同样会失败。它将打印以下内容:

Created thread Created thread

允许使用原始线程创建这两个 RT 线程。但是创建第二个线程后,原始线程被抢占并且再也不允许告知线程结束,因为两个 RT 线程在两个处理器上执行而且永远不会阻塞。

在带有三个或更多处理器的系统上,程序运行至完成并生成一个结果。

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

时间:2011-06-22 Patrick Gallop Mark

单处理器上运行的 RT 代码示例

清单 3 显示了修改后能在单处理器系统中正确运行的代码。main() 方法的逻辑被移到了一个具有第 8 RT 优先级的 “main” RT 线程中。这个优先级比主 RT 线程创建的两个其他 RT 线程的优先级都要高。拥有最高的 RT 优先级使这个主 RT 线程能够成功地创建两个 RT 线程,并且还允许它从五秒钟的休眠中苏醒时能够抢占当前运行的线程。

清单 3. 修改后的 RT 线程示例

import javax.realtime.*; class myRealtimeThreadClass extends javax.realtime.RealtimeThread {   volatile static boolean Stop = false;   static class myRealtimeStartup extends javax.realtime.RealtimeThread {   public void run() {     // 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 1st 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     try {              Thread.sleep(5*1000);     } catch (InterruptedException e) {     }     myRealtimeThreadClass.Stop = true;     }   }   // Primordial thread creates real-time startup thread   public static void main(String args[]) {     myRealtimeStartup startThr = new myRealtimeStartup();     startThr.setPriority(PriorityScheduler.getMinPriority(null)+ 8);     startThr.start();   }   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);   } }

当此程序在单处理器上运行时,它将打印以下结果:

Created thread Thread terminates. Loop count is 32767955 Created thread Thread terminates. Loop count is 0

程序的输出显示所有的线程运行并结束,但是这两

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号