import java.net.*; import java.io.*; import java.util.Date; import Utilities.*; import Synchronization.*; class Message implements Serializable { public int workerID = -1; public boolean containsResult = false; public int numFound = -1; public boolean containsWork = false; public int N = -1; public int inRow = -1; public Date date = null; public Message(int workerID, boolean containsResult, int numFound, boolean containsWork, int inRow, int N) { this.workerID = workerID; this.containsResult = containsResult; this.numFound = numFound; this.containsWork = containsWork; this.inRow = inRow; this.N = N; this.date = new Date(); } public String toString() { return " workerID=" + workerID + ", containsResult=" + containsResult + ", numFound=" + numFound + "\n containsWork=" + containsWork + ", inRow=" + inRow + ", N=" + N + ", date=" + date; } } class NqueensWorker extends MyObject implements Runnable { private int N = -1; private String masterMachine = null; private int portNum = -1; private EstablishRendezvous er = null; private int id = -1; public NqueensWorker(int id, String masterMachine, int portNum) { super("NqueensWorker" + id); this.id = id; this.masterMachine = masterMachine; this.portNum = portNum; er = new EstablishRendezvous(masterMachine, portNum); new Thread(this).start(); } public NqueensWorker(int id, EstablishRendezvous er) { super("NqueensWorker" + id); this.id = id; this.er = er; new Thread(this).start(); } public void run() { Message m = new Message(id, false, 0, false, 0, 0); while (true) { Rendezvous r = er.clientToServer(); m = (Message) r.clientMakeRequestAwaitReply(m); r.close(); if (!m.containsWork) { if (masterMachine != null) { // remote workers System.exit(0); } else return; } N = m.N; int inRow = m.inRow; System.out.println("age()=" + age() + ", " + getName() + " counting solutions with column 1 queen in row " + inRow); int[] board = new int[N+1]; // need 1 through N (0 unused) for (int i = 0; i < board.length; i++) board[i] = 0; board[1] = inRow; int numFound = place(2, board); System.out.println ("age()=" + age() + " Solutions with column 1 queen in row " + inRow + " = " + numFound); m = new Message(id, true, numFound, false, 0, 0); } } private static boolean safe(int row, int column, int[] board) { for (int j=1; jjava NqueensMaster -w3 -n5 Java version=1.1.1, Java vendor=Sun Microsystems Inc. OS name=Windows 95, OS arch=x86, OS version=4.0 Wed Jul 16 23:39:27 EDT 1997 NqueensMaster: N=5, numWorkers=3 age()=110, NqueensWorker0 counting solutions with column 1 queen in row 1 age()=110 Solutions with column 1 queen in row 1 = 2 age()=110, NqueensWorker1 counting solutions with column 1 queen in row 2 age()=110 Solutions with column 1 queen in row 2 = 2 age()=110 m: workerID=0, containsResult=true, numFound=2 containsWork=false, inRow=0, N=0, date=Wed Jul 16 23:39:28 EDT 1997 age()=170, NqueensWorker0 counting solutions with column 1 queen in row 3 age()=170 Solutions with column 1 queen in row 3 = 2 age()=170, NqueensWorker2 counting solutions with column 1 queen in row 4 age()=170 Solutions with column 1 queen in row 4 = 2 age()=170 m: workerID=1, containsResult=true, numFound=2 containsWork=false, inRow=0, N=0, date=Wed Jul 16 23:39:28 EDT 1997 age()=170, NqueensWorker1 counting solutions with column 1 queen in row 5 age()=170 Solutions with column 1 queen in row 5 = 2 age()=170 m: workerID=0, containsResult=true, numFound=2 containsWork=false, inRow=0, N=0, date=Wed Jul 16 23:39:28 EDT 1997 age()=220 m: workerID=2, containsResult=true, numFound=2 containsWork=false, inRow=0, N=0, date=Wed Jul 16 23:39:28 EDT 1997 age()=220 m: workerID=1, containsResult=true, numFound=2 containsWork=false, inRow=0, N=0, date=Wed Jul 16 23:39:28 EDT 1997 age()=220, NqueensMaster: numSolutions=10 ... end of example run(s) */