nachos-java Task1.1 Join
来源:互联网 发布:淘宝网婴儿布鞋 编辑:程序博客网 时间:2024/06/05 04:26
Task 1.1 Join
- 实验要求
- 实验关键代码
- 关键代码分析
- 实验测试代码
- 测试结果分析
实验要求
◆ Implement KThread.join();
◆ Note that another thread does not have to call join(), but if it is called, it must be called only onceThe result of calling join() a second time on the same thread is undefined, even if the second caller is a different thread than the first caller;
◆ A thread must finish executing normally whether or not it is joined;
实验关键代码
变量声明
private ThreadQueue waitForJoinQueue = null;//等待join方法结束的线程队列 private int JoinCount = 0;//定义调用join的次数
方法实现
关键方法主要为join()方法和finish()方法。
Join()方法:
public void join() { Lib.debug(dbgThread, "Joining to thread: " + toString()); Lib.assertTrue(this != currentThread); if(++JoinCount!=1){//如果调用超过一次,则调用失败 System.out.println("sorry,只能调用一次!"); return; } boolean preState = Machine.interrupt().disable();//关中断 //让this线程成为waitForJoinQueue队列的头,表明只有先执行this线程,才会去执行队列里的线程 waitForJoinQueue.acquire(this); waitForJoinQueue.waitForAccess(currentThread);//将当前线程加入到waitForJoinQueue队列里 currentThread.sleep();//当前线程睡眠 Machine.interrupt().restore(preState);//恢复中断}
Finish()方法中在线程sleep()之前添加的核心代码为:
KThread x = currentThread.waitForJoinQueue.nextThread();if(x!=null) x.ready();
关键代码分析
思路分析
当前执行线程(如a线程)调用某线程(如b线程)的join()方法,结果要让a线程睡眠,而让b线程先于a线程执行,b线程执行结束a线程才可继续执行。
方法解释
1、join()方法
将a线程暂时保存到b线程的waitForJoinQueue队列中【在以上代码中采用waitForJoinQueue来保存】,然后让a线程睡眠。
2、finish()方法
在b线程执行结束时(线程结束时会调用finish()方法),扫描一下waitForJoinQueue,如果有线程,则将它唤醒。
关键点和难点
关键点:理清join()方法的含义,要想办法将睡眠的线程存起来,到唤醒时将其唤醒。
难点:理解finish()方法是每个线程执行结束时必会执行的方法。
实验测试代码
public static void joinSelfTest(){ final KThread a = new KThread(new PingTest(1)); System.out.println("thread 1 启动"); a.fork(); System.out.println("调用join方法,当前线程阻塞,thread 1 执行结束后thread 0 再执行【thread 0 为主线程】"); a.join(); System.out.println("thread 0 开始执行"); new PingTest(0).run();}
测试结果分析
测试结果截图
测试结果分析
实验测试代码使用main线程【在测试结果中使用thread 0来表示】和a线程【在测试结果中用thread 1来表示】来对join()方法进行测试,main线程通过调用a线程的join()方法,从而让a线程先执行,执行结束后main线程再继续执行。
- nachos-java Task1.1 Join
- Nachos 课程设计task1.1
- nachos-java Task1.3 Alarm
- nachos-java Task1.4 Communicator
- nachos-java Task1.5 Priority Scheduling
- nachos-java Task1.2 Condition Variables
- nachos-java Task1.6 Boat Program
- nachos课程设计 task1.2
- Nachos课程设计Task1.3
- Nachos课程设计task1.4
- Nachos pro1.1 join()方法修改
- Nachos操作系统:Pro1.1:完成KThread.join方法
- STS-2016-Task1-1
- Task1
- UCB CS162:operating system In Java with NACHOS Lesson 1
- 操作系统:Nachos,java实现线程部分
- 工作Task1
- Task1 notMNIST
- Linux进程间通信——内存共享
- Java基础---I/O流操作
- Linux命令
- 如何实现axi_lite的双向传递
- C++读取文件的问题
- nachos-java Task1.1 Join
- PL/SQL中Command Window自动换行问题
- HDU1051 Wooden Sticks
- 51nod:1265 四点共面(数学)
- CodeForces
- Google浏览器故障解决
- 768B Code For 1 [二分]
- android创建线程
- web渗透-SQL注入数据库信息盗取