package nachos.threads;
import nachos.machine.*;
/**
* A Tester for the KThread class.
* Really, this tests the join() implementation.
*/
public class KThreadTest {
/**
* LoopThread class, which implements a KThread
* that simply prints out numbers in sequence.
*/
private static class LoopThread implements Runnable {
LoopThread(String name, int upTo) {
this.name = name;
this.upTo = upTo;
}
public void run() {
for (int i=0; i<upTo; i++) {
//System.out.println("*** " + name + " looped " + i + " times");
KThread.yield();
}
System.out.println("*** " + name + " done");
}
/* An ID for output purposes */
private String name;
/* The maximum number of iterations */
private int upTo;
}
/**
* JoinThread class, which implements a KThread
* that attempts to join with one or two threads, in sequence.
*/
private static class JoinThread implements Runnable {
JoinThread(String name, KThread thread1, KThread thread2) {
this.name = name;
this.thread1 = thread1;
this.thread2 = thread2;
}
public void run() {
/* Joining with the first thread, if non-null */
if (thread1 != null) {
System.out.println("*** "+name+" joining with "+thread1.toString());
thread1.join();
System.out.println("*** "+name+" joined with "+thread1.toString());
}
/* Joining with the second thread, if non-null */
if (thread2 != null) {
System.out.println("*** "+name+" joining with "+thread2.toString());
thread2.join();
System.out.println("*** "+name+" joined with "+thread2.toString());
}
System.out.println("*** "+name+" done.");
}
/* An ID for output purposes */
private String name;
/* The maximum number of iterations */
private KThread thread1;
private KThread thread2;
}
/**
* Tests whether this module is working.
*/
public static void runTest() {
System.out.println("**** KThread testing begins ****");
/* Create 4 LoopThread, each one looping 3*(i+1) times, so
* that the last create thread loops longer */
KThread loopThreads[] = new KThread[5];
for (int i=0; i < 5; i++) {
loopThreads[i] = new KThread(new LoopThread("loopThread"+3*(i+1),3*(i+1)));
loopThreads[i].setName("loopThread"+3*(i+1));
loopThreads[i].fork();
}
/* Create a JoinThread that waits for loopThread #1
* and then for loopThread #3 */
KThread joinThread1 = new KThread(new JoinThread(
"joinThread #1",loopThreads[1],loopThreads[3]));
joinThread1.setName("joinThread #1");
joinThread1.fork();
/* Create a JoinThread that waits for loopThread #4
* and then for loopThread #2 */
KThread joinThread2 = new KThread(new JoinThread(
"joinThread #2",loopThreads[4],loopThreads[2]));
joinThread2.setName("joinThread #2");
joinThread2.fork();
/* Create a JoinThread that waits for joinThread #1
* and then for loopThread #4 */
KThread joinThread3 = new KThread(new JoinThread(
"joinThread #3",joinThread1,loopThreads[4]));
joinThread3.setName("joinThread #3");
joinThread3.fork();
/* Join with all the above to wait for the end of the testing */
for (int i=0; i < 5; i++) {
loopThreads[i].join();
}
joinThread1.join();
joinThread2.join();
joinThread3.join();
System.out.println("**** KThread testing ends ****");
}
}