线程启动第一个 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
程序的输出显示所有的线程运行并结束,但是这两 |