本文基本java版的nachos系统进行学习及修改。
join函数的作用即为等待调用此函数线程运行完毕。当前线程A调用另一个线程(处于就绪状态) B的join函数时,即A执行B.join()时 (A和B在Nachos中均为KThread类型对象), A被挂起, 直到B运行结束后, join函数返回, A才能继续运行。如果这个线程已经结束,马上返回。且join()函数只能被调用一次,第二次调用不能保证返回,且调用join()函数的线程必须不能是当前线程。join()函数结束时唤醒在等待队列中的所有线程,因此需要实现join()方法和修改finish()方法。
首先,在类体声明一个等待队列waitQueue.
private static ThreadQueue waitQueue = null;
int join_counter = 0;
修改join方法:
public void join() {
Lib.debug(dbgThread, "Joining to thread: " + toString());
// 确认调用此方法的线程是不是currenThread,如果是,接着往下执行
Lib.assertTrue(this != currentThread);
Lib.assertTrue(join_counter == 0);
//关中断;获取当前线程的状态
boolean intStatus = Machine.interrupt().disable();
if(status!=statusFinished){
//将当前运行中的线程加到阻塞队列中
waitQueue.waitForAccess(currentThread);
//当前线程睡眠,放弃占用CPU
sleep();
}
//保存当前的状态,等到中断结束回到当前线程时可以接下去执行
Machine.interrupt().restore(intStatus);
}
修改finish方法:
public static void finish() {
Lib.debug(dbgThread, "Finishing thread: " + currentThread.toString());
//关中断
Machine.interrupt().disable();
//当前线程结束的标志
Machine.autoGrader().finishingCurrentThread();
Lib.assertTrue(toBeDestroyed == null);
//表示当前线程即将被销毁
toBeDestroyed = currentThread;
//修改当前线程的状态为结束
currentThread.status = statusFinished;
//调用阻塞(等待)队列中的第一个线程准备执行
KThread waitThread = currentThread.waitQueue.nextThread();
if (waitThread != null)
waitThread.ready();
//当前线程放弃对CPU的占有
sleep();
}
接下来,测试我们修改的是否正确:
①模仿PingTest新建一个JoinTest内部类private static class JoinTest implements Runnable {
public void run() {
System.out.println("B线程运行中");
System.out.println("B线程结束运行");
}
}
②新建joinTest方法
/**
* join方法测试
*/
public static void joinTest(){
System.out.println("\n任务phase1.1");
Lib.debug(dbgThread, "开始join方法测试");
KThread aThread = new KThread(new JoinTest());
aThread.setName("新线程").fork();
System.out.println("A线程运行中");
System.out.println("A线程暂停");
aThread.join();
System.out.println("A线程恢复运行");
}
最后,在ThreadKernel类的selfTest方法里调用joinTest方法:
public void selfTest() {
KThread.selfTest();
KThread.joinTest();
Semaphore.selfTest();
SynchList.selfTest();
if (Machine.bank() != null) {
ElevatorBank.selfTest();
}
}
测试成功!