KThread和TCB的构造顺序分析-if(currentThread!=null)?//接上elsereadyQueue=ThreadedKernel.scheduler.newThreadQueue(false);readyQueue.acquire(this);currentThread = this;tcb=TCB.currentTCB(;//这句话非常重要,我们在下面会分析到createIdleThread();7进入了"else"这个模块之后,currentThread被立即赋值了,结合上下文的语意,我们可以推测这个“else“模块不会被执行第二次。于是我们断言:首次调用KThread的构造函数,作用仅仅是初始化!
KThread和TCB的构造顺序分析 ——if (currentThread != null)? . // 接上 else { readyQueue = ThreadedKernel. scheduler.newThreadQueue(false); readyQueue.acquire(this); currentThread = this; tcb = TCB.currentTCB(); // 这句话非常重要,我们在下面会分析到 createIdleThread(); } 进入了”else”这个模块之后,currentThread被立即赋值了,结合上下文的语 意,我们可以推测这个”else”模块不会被执行第二次。于是我们断言: 首次调用KThread的构造函数,作用仅仅是初始化!
KThread和TCB的构造顺序分析一一改造“newKThreadNo1"根据上述分析,“newKThreadNo1”和直觉上大相径庭,似乎改写成KThread.initialize;会更自然一点,那为何需要这么写?publicvoidinitialize(String[largs)newKThread(null);//是不是KThread.initialize();更自然?子(提示:currentThread=this这句话揭示了问题的答案)我们的目标是研究每个KThread是如何和一个TCB绑定并且运行起来的,“newKThreadNo1没有给我们提供有用的东西。幸运的是,它的一个子过程:createIdleThread引起了我们的注意:
KThread和TCB的构造顺序分析 ——改造“new KThread No1” 根据上述分析,“new KThread No1” 和直觉上大相径庭,似乎改写成 KThread.initialize(); 会更自然一点,那为何需要这么写? public void initialize(String[] args) { new KThread(null); // 是不是 KThread.initialize(); 更自然? } (提示:currentThread = this 这句话揭示了问题的答案) 我们的目标是研究每个KThread是如何和一个TCB绑定并且运行起来的, “new KThread No1”没有给我们提供有用的东西。幸运的是,它的一个子过 程:createIdleThread引起了我们的注意:
KThread和TCB的构造顺序分析--IdleThreadprivatestaticvoidcreateIdleThread()idleThread=newKThread(newRunnableOpublic void run(Owhile(true)yield();73);//"newKThreadNo2"idleThread.setName("idle").fork();子我们又看到一句newKThread(..);可以叫作"newKThreadNo2"与"No1”不同,这一次currentThread不为null了,于是,KThread的构造函数只会执行一句话:if(currentThread!=null)tcb = new TCB();}
KThread和TCB的构造顺序分析 ——IdleThread private static void createIdleThread() { idleThread = new KThread(new Runnable() { public void run() { while (true) yield(); }}); // “new KThread No2” idleThread.setName(“idle”).fork(); } 我们又看到一句new KThread(.); 可以叫作“new KThread No2”。 与”No1” 不同,这一次currentThread 不为null了,于是,KThread的构造 函数只会执行一句话: if (currentThread != null) { tcb = new TCB(); }