实时Java,第3部分 - 线程化和同步 - 编程入门网
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);
}
}
清单 1 中的程序具有三个普通 Java 线程的用户线程: 原始线程: 它是启动过程中隐式创建的主线程,执行 main() 方法。 main() 创建了两个普通 Java 线程:一个线程的优先级为 4 而另一个线程的优先级为 6。 主线程通过调用 Thread.sleep() 方法休眠五秒钟来达到故意阻塞自身的目的。 休眠五秒钟后,此线程指示其他两个线程结束。 优先级为 4 的线程: 此线程由原始线程创建,后者执行包含 for 循环的 run() 方法。 实时Java,第3部分 - 线程化和同步(4)时间:2011-06-22 Patrick Gallop Mark该线程: 在每次循环迭代中增加一个计数。 通过调用 Thread.yield() 方法自愿放弃它的时间片。 在主线程发出请求时结束。结束前打印循环计数。 优先级为 6 的线程:此线程执行的动作与优先级为 4 的线程相同。 如果此程序在单处理器或卸载的多处理器上运行,则每个线程打印的 for 循环迭代计数大致相同。在一次运行中,程序将打印:
如果删除对 Thread.yield() 的调用,则两个线程的循环计数可能相近,但绝不可能相同。在 SCHED_OTHER 策略中为这两个线程都指定了相同的默认优先级。因此给两个线程分配了相同的时间片执行。因为线程执行的是相同的代码,所以它们应作出类似的动态优先级调整并在相同的运行队列中轮替执行。但是由于首先执行优先级为 4 的线程,因此在五秒钟的执行时间间隔中,它分得的时间稍多一些并且打印的循环计数也稍大一些。 理解 RT 线程 RT 线程是 javax.realtime.RealtimeThread 的一个实例。RTSJ 要求规范的实现必须为 RT 线程提供至少 28 个连续的优先级。这些优先级被称作实时优先级。规范中并没有指定 RT 优先级范围的开始值,除非其优先级高于 10 —— 普通 Java 线程的最高优先级值。出于可移植性的原因,应用程序代码应使用新的 PriorityScheduler 类的 getPriorityMin() 和 getPriorityMax() 方法来确定可用的 RT 优先级值的范围。 对 RT 线程的推动 JLS 中的线程调度并不精确而且只提供了 10 个优先级值。由 Linux 实现的 POSIX SCHED_OTHER 策略满足了各种应用程序的需要。但是 SCHED_OTHER 策略具有一些不好的特性。动态优先级调整和时间片划分可能在不可预测的时间内发生。SCHED_OTHER 优先级的值(40)其实并不算大,其中一部分已经被使用普通 Java 线程的应用程序和动态优先级调整利用了。JVM 还需要对内部线程使用优先级以达到一些特殊目的,比如垃圾收集(GC)。 缺少确定性、需要更高的优先级级别以及要求与现有应用程序兼容,这些因素引发了对扩展的需求,这将为 Java 程序员提供新的调度功能。RTSJ 中描述的 javax.realtime 包中的类提供了这些功能。在 WebSphere Real Time 中,Linux SCHED_FIFO 调度策略满足了 RTSJ 调度需求。 RT Java 线程的线程调度 在 WebSphere Real Time 中,支持 28 个 RT Java 优先级,其范围为 11 到 38。PriorityScheduler 类的 API 应用于检索这个范围。本节描述了比 RTSJ 更多的线程调度细节以及 Linux SCHED_FIFO 策略的一些方面,已经超出了 RTSJ 的需求。 RTSJ 将 RT 优先级视作由运行时系统在逻辑上实现的优先级,该系统为每个 RT 优先级保持一个独立队列。线 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |