2

私はJavaでBully Algorithmのプログラムを書いて
います。コードは次のとおりです。

package newbully;

public class NewBully {

    public static void main(String[] args) {
        int total_processes = 6;
        RunningThread[] t = new RunningThread[total_processes];
        for (int i = 0; i < total_processes; i++) {
            t[i] = new RunningThread(new Process(i+1, i+1), total_processes);//passing process id, priority, total no. of processes to running thread
        }
        try {
            Election.initialElection(t);
        } catch (Exception e) {
            System.out.println("Possibly you are using null references in array");
        }
        for (int i = 0; i < total_processes; i++) {
            new Thread(t[i]).start();//start every thread
        }
    }
}


package newbully;

import java.util.*;
import java.io.*;
import java.net.*;

public class RunningThread implements Runnable {

    private Process process;
    private int total_processes;
    ServerSocket[] sock;
    Random r;

    public Process getProcess() {
        return process;
    }

    public void setProcess(Process process) {
        this.process = process;
    }

    public RunningThread(Process process, int total_processes) {
        this.process = process;
        this.total_processes = total_processes;
        this.r = new Random();
        this.sock = new ServerSocket[total_processes];
    }

    synchronized private void recovery() {
        System.out.println("Process[" + this.process.getPid() + "]: -> Recovered from Crash");
        //Find current co-ordinator.
    }

    synchronized private void pingCoOrdinator() {
        try {
            if (Election.isPingFlag()) {
                synchronized (Election.lock) {
                    Election.lock.wait();
                }
            }
            if (!Election.isElectionFlag()) {
                Election.setPingFlag(true);
                System.out.println("Process[" + this.process.getPid() + "]: Are you alive?");
                Socket outgoing = new Socket(InetAddress.getLocalHost(), 12345);
                outgoing.close();
                Election.setPingFlag(false);
                synchronized (Election.lock) {
                    Election.lock.notifyAll();
                }
            }
        } catch (Exception ex) {
            //Initiate Election
            System.out.println("process[" + this.process.getPid() + "]: -> Co-Ordinator is down\nInitiating Election");
            Election.setElectionFlag(true);
            Election.setPingFlag(false);
            synchronized (Election.lock) {
                Election.lock.notifyAll();
            }
        }
    }

    synchronized private void executeJob() {
        int temp = r.nextInt(20);
        for (int i = 0; i <= temp; i++) {
            try {
                Thread.sleep(700);
            } catch (InterruptedException e) {
                System.out.println("Error Executing Thread:" + process.getPid());
                System.out.println(e.getMessage());
            }
        }
    }

    synchronized private boolean sendMessage() {
        boolean response = false;
        int i = 0;
        try {
            if (Election.isMessageFlag()) {
                synchronized (Election.lock) {
                    Election.lock.wait();
                }
            }
            Election.setMessageFlag(true);
            if (Election.isElectionFlag()) {
                for (i = this.process.getPid() + 1; i <= this.total_processes; i++) {
                    try {
                        Socket electionMessage = new Socket(InetAddress.getLocalHost(), 10000 + i);
                        System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "]  responded to election message successfully");
                        electionMessage.close();
                        response = true;
                    } catch (Exception ex) {
                        System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "] did not respond to election message");
                    }
                }
            }
            Election.setMessageFlag(false);
            synchronized (Election.lock) {
                Election.lock.notifyAll();
            }
        } catch (Exception ex1) {
            System.out.println(ex1.getMessage());
        }

        return response;
    }

    synchronized private void serve() {
        try {
            //service counter
            Socket incoming = null;
            ServerSocket s = new ServerSocket(12345);
            for (int counter = 0; counter < 10; counter++) {
                incoming = s.accept();
                System.out.println("Process[" + this.process.getPid() + "]:Yes");
                Scanner scan = new Scanner(incoming.getInputStream());
                PrintWriter out = new PrintWriter(incoming.getOutputStream(), true);
                if (scan.hasNextLine()) {
                    if (scan.nextLine().equals("Who is the co-ordinator?")) {
                        System.out.print("Process[" + this.process.getPid() + "]:");
                        out.println(this.process);
                    }
                }
            }
            //after serving 10 requests go down for random time
            this.process.setCoOrdinatorFlag(false);
            this.process.setDownflag(true);
            try {
                incoming.close();
                s.close();
                sock[this.process.getPid() - 1].close();
                Thread.sleep((this.r.nextInt(10) + 1) * 1000000);//going down
                recovery();
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }


        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    @Override
    public void run() {
        try {
            sock[this.process.getPid() - 1] = new ServerSocket(10000 + this.process.getPid());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        while (true) {
            if (process.isCoOrdinatorFlag()) {
                //serve other processes
                serve();
            } else {
                while (true) {
                    //Execute some task
                    executeJob();

                    //Ping the co-ordinator
                    pingCoOrdinator();

                    if (Election.isElectionFlag()) {
                        if (!sendMessage()) {//elect self as co-ordinator
                            System.out.println("New Co-Ordinator: Process[" + this.process.getPid() + "]");
                            this.process.setCoOrdinatorFlag(true);
                            Election.setElectionFlag(false);
                            break;
                        }
                    }
                }
            }
        }
    }
}

package newbully;

public class Election {

    private static boolean pingFlag = false;
    private static boolean electionFlag = false;
    private static boolean messageFlag = false;
    public static final Object lock = new Object(); 

    public static boolean isMessageFlag() {
        return messageFlag;
    }

    public static void setMessageFlag(boolean messageFlag) {
        Election.messageFlag = messageFlag;
    }

    public static boolean isPingFlag() {
        return pingFlag;
    }

    public static void setPingFlag(boolean pingFlag) {
        Election.pingFlag = pingFlag;
    }

    public static boolean isElectionFlag() {
        return electionFlag;
    }

    public static void setElectionFlag(boolean electionFlag) {
        Election.electionFlag = electionFlag;
    }

    public static void initialElection(RunningThread[] t) {
        Process temp = new Process(-1, -1);
        for (int i = 0; i < t.length; i++) {
            if (temp.getPriority() < t[i].getProcess().getPriority()) {
                temp = t[i].getProcess();
            }
        }
        t[temp.pid - 1].getProcess().CoOrdinatorFlag = true;
    }
}

package newbully;

public class Process {

    int pid;
    boolean downflag,CoOrdinatorFlag;

    public boolean isCoOrdinatorFlag() {
        return CoOrdinatorFlag;
    }

    public void setCoOrdinatorFlag(boolean isCoOrdinator) {
        this.CoOrdinatorFlag = isCoOrdinator;
    }
    int priority;

    public boolean isDownflag() {
        return downflag;
    }

    public void setDownflag(boolean downflag) {
        this.downflag = downflag;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

    public Process() {
    }

    public Process(int pid, int priority) {
        this.pid = pid;
        this.downflag = false;
        this.priority = priority;
        this.CoOrdinatorFlag = false;
    }
}

出力は次のとおりです。

//--When delay in executeJob() method is 100

Process[4]: Are you alive?
Process[6]:Yes
Process[4]: Are you alive?
Process[6]:Yes
Process[3]: Are you alive?
Process[6]:Yes
Process[5]: Are you alive?
Process[6]:Yes
Process[1]: Are you alive?
Process[6]:Yes
Process[4]: Are you alive?
Process[6]:Yes
Process[3]: Are you alive?
Process[6]:Yes
Process[3]: Are you alive?
Process[6]:Yes
Process[2]: Are you alive?
Process[6]:Yes
Process[5]: Are you alive?
Process[6]:Yes
Process[1]: Are you alive?
process[1]: -> Co-Ordinator is down
Initiating Election
Process[1] -> Process[2]  responded to election message successfully
Process[1] -> Process[3]  responded to election message successfully
Process[1] -> Process[4]  responded to election message successfully
Process[1] -> Process[5]  responded to election message successfully
Process[1] -> Process[6] did not respond to election message
Process[2] -> Process[3]  responded to election message successfully
Process[3] -> Process[4]  responded to election message successfully
Process[4] -> Process[5]  responded to election message successfully
Process[2] -> Process[4]  responded to election message successfully
Process[2] -> Process[5]  responded to election message successfully
Process[3] -> Process[5]  responded to election message successfully
Process[5] -> Process[6] did not respond to election message
New Co-Ordinator: Process[5]
New Co-Ordinator: Process[1]
Address already in use: JVM_Bind
Address already in use: JVM_Bind
Address already in use: JVM_Bind


 //--When delay in executeJob() method is 700
Process[3]: Are you alive?
Process[6]:Yes
Process[5]: Are you alive?
Process[6]:Yes
Process[2]: Are you alive?
Process[1]: Are you alive?
Process[6]:Yes
Process[6]:Yes
Process[5]: Are you alive?
Process[1]: Are you alive?
Process[6]:Yes
Process[6]:Yes
Process[4]: Are you alive?
Process[6]:Yes
Process[3]: Are you alive?
Process[6]:Yes
Process[2]: Are you alive?
Process[6]:Yes
Process[1]: Are you alive?
Process[6]:Yes
Process[4]: Are you alive?
process[4]: -> Co-Ordinator is down
Initiating Election
Process[4] -> Process[5]  responded to election message successfully
Process[4] -> Process[6] did not respond to election message
Process[5] -> Process[6] did not respond to election message
New Co-Ordinator: Process[5]
Process[1]: Are you alive?
Process[5]:Yes
Process[1]: Are you alive?
Process[5]:Yes
Process[3]: Are you alive?
Process[5]:Yes
Process[2]: Are you alive?
Process[5]:Yes
Process[1]: Are you alive?
Process[5]:Yes
Process[4]: Are you alive?
Process[5]:Yes
Process[2]: Are you alive?
Process[5]:Yes
Process[4]: Are you alive?
Process[5]:Yes
Process[3]: Are you alive?
Process[5]:Yes
Process[3]: Are you alive?
Process[5]:Yes
Process[2]: Are you alive?
process[2]: -> Co-Ordinator is down
Initiating Election
Process[2] -> Process[3]  responded to election message successfully
Process[2] -> Process[4]  responded to election message successfully
Process[2] -> Process[5] did not respond to election message
Process[2] -> Process[6] did not respond to election message
Process[3] -> Process[4]  responded to election message successfully
Process[3] -> Process[5] did not respond to election message
Process[3] -> Process[6] did not respond to election message
Process[1] -> Process[2]  responded to election message successfully
Process[1] -> Process[3]  responded to election message successfully
Process[1] -> Process[4]  responded to election message successfully
Process[1] -> Process[5] did not respond to election message
Process[1] -> Process[6] did not respond to election message
Process[2] -> Process[3]  responded to election message successfully
Process[2] -> Process[4]  responded to election message successfully
Process[2] -> Process[5] did not respond to election message
Process[2] -> Process[6] did not respond to election message
Process[4] -> Process[5] did not respond to election message
Process[4] -> Process[6] did not respond to election message
New Co-Ordinator: Process[4]
Process[3]: Are you alive?
Process[4]:Yes
Process[3]: Are you alive?
Process[4]:Yes
Process[1]: Are you alive?
Process[4]:Yes
Process[2]: Are you alive?
Process[4]:Yes
Process[1]: Are you alive?
Process[4]:Yes
Process[2]: Are you alive?
Process[4]:Yes
Process[2]: Are you alive?
Process[4]:Yes
Process[2]: Are you alive?
Process[4]:Yes
Process[3]: Are you alive?
Process[4]:Yes
Process[1]: Are you alive?
Process[4]:Yes
Process[3]: Are you alive?
process[3]: -> Co-Ordinator is down
Initiating Election
Process[3] -> Process[4] did not respond to election message
Process[3] -> Process[5] did not respond to election message
Process[3] -> Process[6] did not respond to election message
New Co-Ordinator: Process[3]
New Co-Ordinator: Process[2]
Address already in use: JVM_Bind
Address already in use: JVM_Bind
Address already in use: JVM_Bind
Address already in use: JVM_Bind
Address already in use: JVM_Bind

最後に、の例外が発生し始めますAddress already in use: JVM_Bin
また、例外をスローする直前に出力で最新の選択されたコーディネーターをチェックすると、is co-ordinator alive?
コーディネーターが死亡したときにコーディネーターが途中でウェイクアップしないように十分な遅延を提供したと確信しています。
余分なディールを与えると、プログラムが先に進み、そうでない場合は途中で停止します。
では、なぜこの問題が発生する必要があるのでしょうか。


例外メッセージの直前に出力をよく見ると、コーディネーター 2ce が選択されているため、例外が発生している理由がわかりました。
スレッドがコーディネーターとして選択されるたびに、ポート 12345 で ServerSocket が開かれます。2ce
が発生したため、例外がスローされている可能性があります。
しかし、私はそれを理解していません...なぜそれは2ceを選択したのですか??

4

2 に答える 2

3

どちらの場合も、エラー メッセージは「アドレスは既に使用されています: JVM_Bind」です。

通常、このメッセージは java.net.BindException の一部であり、Socket を作成または開こうとしたときにポートが既に使用されている場合にスローされます。この場合、同じソケットを 2 回開いたり作成したりしようとしている可能性があります。

これは、ソケットのオープンとクローズの間に例外が発生し、socket.close() の呼び出しが停止するために発生する可能性があります。この場合、選挙リーダーへのソケットを作成すると、ホストが「クラッシュ」したために例外がスローされ、したがって close() は呼び出されません。

行を追加する必要があると思います

選挙メッセージ.close(); 送信メッセージのこの部分の catch 句に。

try {
    Socket electionMessage = new Socket(InetAddress.getLocalHost(), 10000 + i);
    System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "]  responded to election message successfully");
    electionMessage.close();
    response = true;
} catch (Exception ex) {
//Add close here
    System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "] did not respond to election message");
}

また、他のすべての関連する catch 句に close を追加することをお勧めします。これは、これが他の場所で発生しており、関連する問題を回避するための常に良い方法である場合に備えてです。また、他の落とし穴に引っかからないように、各場所でキャッチする例外を明確に指定することをお勧めします。

これが良い出発点になることを願っています。


最初のコメントに応じて編集

スレッドを「ロック」する方法に問題があると思います。コード内の特定のポイントに到達したことを伝えるために、ブール値のフラグに依存しています。ただし、ブール フラグ自体は同期ブロックで制御されず、コードの他のロックでも制御されません。したがって、複数のスレッドがロックを渡し、同じソケットを開こうとする試みなど、予期しないイベントを引き起こす可能性があります。

ロック用のオブジェクトを含むコードを使用しています

if (Election.isMessageFlag()) {
    synchronized (Election.lock) {
        Election.lock.wait();
    }
}
Election.setMessageFlag(true);
if (Election.isElectionFlag()) {
   // Do Stuff
   // Open/close Sockets etc
}
Election.setMessageFlag(false);
synchronized (Election.lock) {
    Election.lock.notifyAll();
}

つまり、フラグが設定される前に (次の行で!) 最初の if ステートメントを複数のスレッドが渡して、後続のスレッドを待機させることができます。

ただし、代わりに ReentrantLock を使用する場合は、次のようなコードを使用する必要があります。

lock.lock();  // block until condition holds
try {
  // Do Stuff
  // OPen CLose Sockets etc
} finally {
  lock.unlock()
}

明らかに、選択が行われているかどうかを示すためにいくつかのフラグを設定する必要があるかもしれませんが、実行中のコードを ReentrantLock などの実際のロックまたは適切な同期ブロック内で保護するようにしてください。

お役に立てれば

于 2012-04-18T14:35:56.427 に答える
0

上記のすべてのコメントを参照した後、他の人が参照できるように修正されたコードを投稿しています。
コードの改善提案は大歓迎です...

package newbully;

public class NewBully {

    public static void main(String[] args) {
        int total_processes = 6;
        RunningThread[] t = new RunningThread[total_processes];
        for (int i = 0; i < total_processes; i++) {
            t[i] = new RunningThread(new Process(i+1, i+1), total_processes);//passing process id, priority, total no. of processes to running thread
        }
        try {
            Election.initialElection(t);
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
        for (int i = 0; i < total_processes; i++) {
            new Thread(t[i]).start();//start every thread
        }
    }
}

package newbully;

import java.util.concurrent.locks.ReentrantLock;

public class Election {

    public static ReentrantLock pingLock = new ReentrantLock();
    public static ReentrantLock electionLock = new ReentrantLock();
    private static boolean electionFlag = false; //By default no election is going on
    private static boolean pingFlag = true; //By default I am allowed to ping 
    public static Process electionDetector;

    public static Process getElectionDetector() {
        return electionDetector;
    }

    public static void setElectionDetector(Process electionDetector) {
        Election.electionDetector = electionDetector;
    }

    public static boolean isPingFlag() {
        return pingFlag;
    }

    public static void setPingFlag(boolean pingFlag) {
        Election.pingFlag = pingFlag;
    }

    public static boolean isElectionFlag() {
        return electionFlag;
    }

    public static void setElectionFlag(boolean electionFlag) {
        Election.electionFlag = electionFlag;
    }

    public static void initialElection(RunningThread[] t) {
        Process temp = new Process(-1, -1);
        for (int i = 0; i < t.length; i++) {
            if (temp.getPriority() < t[i].getProcess().getPriority()) {
                temp = t[i].getProcess();
            }
        }
        t[temp.pid - 1].getProcess().CoOrdinatorFlag = true;
    }
}

package newbully;

import java.util.*;
import java.io.*;
import java.net.*;

public class RunningThread implements Runnable {

    private Process process;
    private int total_processes;
    private static boolean messageFlag[];
    ServerSocket[] sock;
    Random r;

    public Process getProcess() {
        return process;
    }

    public void setProcess(Process process) {
        this.process = process;
    }

    public RunningThread(Process process, int total_processes) {
        this.process = process;
        this.total_processes = total_processes;
        this.r = new Random();
        this.sock = new ServerSocket[total_processes];
        RunningThread.messageFlag = new boolean[total_processes];
        for (int i = 0; i < total_processes; i++) {
            RunningThread.messageFlag[i] = false;
        }
    }

    synchronized private void recovery() {
        while (Election.isElectionFlag());//if election is going on then wait
        System.out.println("Process[" + this.process.getPid() + "]: -> Recovered from Crash");
        //Find current co-ordinator.         
        try {
            Election.pingLock.lock();
            Election.setPingFlag(false);
            Socket outgoing = new Socket(InetAddress.getLocalHost(), 12345);
            Scanner scan = new Scanner(outgoing.getInputStream());
            PrintWriter out = new PrintWriter(outgoing.getOutputStream(), true);
            System.out.println("Process[" + this.process.getPid() + "]:-> Who is the co-ordinator?");
            out.println("Who is the co-ordinator?");
            out.flush();
            String pid = scan.nextLine();
            String priority = scan.nextLine();
            if (this.process.getPriority() > Integer.parseInt(priority)) { //Bully Condition
                out.println("Resign");
                out.flush();
                System.out.println("Process[" + this.process.getPid() + "]: Resign -> Process[" + pid + "]");
                String resignStatus = scan.nextLine();
                if (resignStatus.equals("Successfully Resigned")) {
                    this.process.setCoOrdinatorFlag(true);
                    sock[this.process.getPid() - 1] = new ServerSocket(10000 + this.process.getPid());
                    System.out.println("Process[" + this.process.getPid() + "]: -> Bullyed current co-ordinator Process[" + pid + "]");
                }
            } else {
                out.println("Don't Resign");
                out.flush();
            }
            Election.pingLock.unlock();
            return;

        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

    }

    synchronized private void pingCoOrdinator() {
        try {
            Election.pingLock.lock();
            if (Election.isPingFlag()) {
                System.out.println("Process[" + this.process.getPid() + "]: Are you alive?");
                Socket outgoing = new Socket(InetAddress.getLocalHost(), 12345);
                outgoing.close();
            }
        } catch (Exception ex) {
            Election.setPingFlag(false);
            Election.setElectionFlag(true);
            Election.setElectionDetector(this.process);
            //Initiate Election
            System.out.println("process[" + this.process.getPid() + "]: -> Co-Ordinator is down\n" + "process[" + this.process.getPid() + "]: ->Initiating Election");
        } finally {
            Election.pingLock.unlock();
        }
    }

    private void executeJob() {
        int temp = r.nextInt(20);
        for (int i = 0; i <= temp; i++) {
            try {
                Thread.sleep((temp + 1) * 100);
            } catch (InterruptedException e) {
                System.out.println("Error Executing Thread:" + process.getPid());
                System.out.println(e.getMessage());
            }
        }
    }

    synchronized private boolean sendMessage() {
        boolean response = false;
        try {
            Election.electionLock.lock();
            if (Election.isElectionFlag() && !RunningThread.isMessageFlag(this.process.getPid() - 1) && this.process.priority >= Election.getElectionDetector().getPriority()) {

                for (int i = this.process.getPid() + 1; i <= this.total_processes; i++) {
                    try {
                        Socket electionMessage = new Socket(InetAddress.getLocalHost(), 10000 + i);
                        System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "]  responded to election message successfully");
                        electionMessage.close();
                        response = true;
                    } catch (IOException ex) {
                        System.out.println("Process[" + this.process.getPid() + "] -> Process[" + i + "] did not respond to election message");
                    } catch (Exception ex) {
                        System.out.println(ex.getMessage());
                    }
                }
                this.setMessageFlag(true, this.process.getPid() - 1);//My message sending is done
                Election.electionLock.unlock();
                return response;
            } else {
                throw new Exception();
            }
        } catch (Exception ex1) {
            Election.electionLock.unlock();
            return true;
        }
    }

    public static boolean isMessageFlag(int index) {
        return RunningThread.messageFlag[index];
    }

    public static void setMessageFlag(boolean messageFlag, int index) {
        RunningThread.messageFlag[index] = messageFlag;
    }

    synchronized private void serve() {
        try {
            boolean done = false;
            Socket incoming = null;
            ServerSocket s = new ServerSocket(12345);
            Election.setPingFlag(true);
            int temp = this.r.nextInt(5) + 5;// min 5 requests and max 10 requests
            for (int counter = 0; counter < temp; counter++) {
                incoming = s.accept();
                if (Election.isPingFlag()) {
                    System.out.println("Process[" + this.process.getPid() + "]:Yes");
                }
                Scanner scan = new Scanner(incoming.getInputStream());
                PrintWriter out = new PrintWriter(incoming.getOutputStream(), true);
                while (scan.hasNextLine() && !done) {
                    String line = scan.nextLine();
                    if (line.equals("Who is the co-ordinator?")) {
                        System.out.println("Process[" + this.process.getPid() + "]:-> " + this.process.getPid());
                        out.println(this.process.getPid());
                        out.flush();
                        out.println(this.process.getPriority());
                        out.flush();
                    } else if (line.equals("Resign")) {
                        this.process.setCoOrdinatorFlag(false);
                        out.println("Successfully Resigned");
                        out.flush();
                        incoming.close();
                        s.close();
                        System.out.println("Process[" + this.process.getPid() + "]:-> Successfully Resigned");
                        return;
                    } else if (line.equals("Don't Resign")) {
                        done = true;
                    }
                }
            }
            //after serving 5-10 requests go down for random time
            this.process.setCoOrdinatorFlag(false);
            this.process.setDownflag(true);
            try {
                incoming.close();
                s.close();
                sock[this.process.getPid() - 1].close();
                Thread.sleep(15000);//(this.r.nextInt(10) + 1) * 10000);//going down
                recovery();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }


        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    @Override
    public void run() {
        try {
            sock[this.process.getPid() - 1] = new ServerSocket(10000 + this.process.getPid());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        while (true) {
            if (process.isCoOrdinatorFlag()) {
                //serve other processes
                serve();
            } else {
                while (true) {
                    //Execute some task
                    executeJob();
                    //Ping the co-ordinator
                    pingCoOrdinator();
                    //Do Election
                    if (Election.isElectionFlag()) {
                        if (!sendMessage()) {//elect self as co-ordinator
                            Election.setElectionFlag(false);//Election is Done
                            System.out.println("New Co-Ordinator: Process[" + this.process.getPid() + "]");
                            this.process.setCoOrdinatorFlag(true);
                            for (int i = 0; i < total_processes; i++) {
                                RunningThread.setMessageFlag(false, i);
                            }
                            break;
                        }
                    }
                }
            }
        }
    }
}

package newbully;

public class Process {

    int pid;
    boolean downflag,CoOrdinatorFlag;

    public boolean isCoOrdinatorFlag() {
        return CoOrdinatorFlag;
    }

    public void setCoOrdinatorFlag(boolean isCoOrdinator) {
        this.CoOrdinatorFlag = isCoOrdinator;
    }
    int priority;

    public boolean isDownflag() {
        return downflag;
    }

    public void setDownflag(boolean downflag) {
        this.downflag = downflag;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

    public Process() {
    }

    public Process(int pid, int priority) {
        this.pid = pid;
        this.downflag = false;
        this.priority = priority;
        this.CoOrdinatorFlag = false;
    }
}
于 2012-04-21T09:26:21.550 に答える