Search code examples
javamultithreadingsynchronous

Three threads.T1 print 1,4,7.. messages sequence T2 print 2,5,8.. and T3 print 3,6,9.. How do I synchronize these three to print 1-15 message sequence


public class Chat {
int flag=0;

public synchronized void Friend1(String msg) {
 if(flag>0) {
     try {
         wait();
     }
     catch(InterruptedException e) {
         e.printStackTrace();
     }
 }
 System.out.println(msg);
 flag=1;
 notify();
 }

public synchronized void Friend2(String msg) {
if(flag==0) {
    try {
        wait();
    }
    catch(InterruptedException e) {
        e.printStackTrace();
    }
}
System.out.println(msg);
flag=0;
notify();
}
public synchronized void Friend3(String msg) {
if(flag<0) {
    try {
        wait();
    }
    catch(InterruptedException e) {
        e.printStackTrace();
    }
}
System.out.println(msg);
flag=(-1);
notify();
}
}


public class T1 implements Runnable {
Chat m;
String[] s1= {"Hi","How are you all?","Why what happened","Yes, We are in a hectic situation but we have to continue our studies and be strong inside","Fave faith in Allah! Eveything will be ok"};

public T1(Chat m1) {
    this.m=m1;
    new Thread(this, "Friend1").start();
    }
public void run() {
    for(int i=0; i<s1.length; i++) {
        m.Friend1(s1[i]);
    }
}
}


public class T2 implements Runnable{
Chat m;
String[] s2= {"Hy","I am fine","Is there anything wrong?","There is nothing we can do about in this pandemic situation but to study and pray","Everything will be fine soon"};

public T2(Chat m2) {
    this.m=m2;
    new Thread(this, "Answer").start();
    }
public void run() {
    for(int i=0; i<s2.length; i++) {
        m.Friend2(s2[i]);
    }
}
}
public class T3 implements Runnable {
Chat m;
String[] s3= {"Hello","I am not fine","I am very depressed about my online classes","I feel too much preassure","Yeap I will start praying to Allah that everything comes around"};

public T3(Chat m3) {
    this.m=m3;
    new Thread(this, "Friends3").start();
    }
public void run() {
    for(int i=0; i<s3.length; i++) {
        m.Friend3(s3[i]);
    }
}
}

public class Main {
public static void main(String[] args) {
Chat m=new Chat();
new T1(m);
new T2(m);
new T3(m);
   }
   }

Output is: Hi

Hy

How are you all?

I am fine

Why what happened

Is there anything wrong?

Yes, We are in a hectic situation but we have to continue our studies and be strong inside

There is nothing we can do about in this pandemic situation but to study and pray

Fave faith in Allah! Eveything will be ok

Everything will be fine soon

Hello


Solution

  • In your case you know that every thread should print phrase after previous:

    • 2 after 1
    • 3 after 2
    • 1 after 3

    So you can create variable that will be store number of the thread that shouldmake action now:

    AtomicInteger currentSpeaker = new AtomicInteger(1);
    

    Every thread can check this var before printing next phrase and set new value for next thread:

    public class T1 implements Runnable {
        Chat m;
        String[] s1 = {"Hi", "How are you all?", "Why what happened", "Yes, We are in a hectic situation but we have to continue our studies and be strong inside", "Fave faith in Allah! Eveything will be ok"};
    
        public T1(Chat m1) {
            this.m = m1;
            new Thread(this, "Friend1").start();
        }
    
        public void run() {
            for (int i = 0; i < s1.length; i++) {
                while (currentSpeaker.get() != 1) delay(100L);
                m.Friend1(s1[i]);
                currentSpeaker.set(2);
            }
        }
    }
    
    
    public class T2 implements Runnable {
        Chat m;
        String[] s2 = {"Hy", "I am fine", "Is there anything wrong?", "There is nothing we can do about in this pandemic situation but to study and pray", "Everything will be fine soon"};
    
        public T2(Chat m2) {
            this.m = m2;
            new Thread(this, "Answer").start();
        }
    
        public void run() {
            for (int i = 0; i < s2.length; i++) {
                while (currentSpeaker.get() != 2) delay(100L);
                m.Friend2(s2[i]);
                currentSpeaker.set(3);
            }
        }
    }
    
    public class T3 implements Runnable {
        Chat m;
        String[] s3 = {"Hello", "I am not fine", "I am very depressed about my online classes", "I feel too much preassure", "Yeap I will start praying to Allah that everything comes around"};
    
        public T3(Chat m3) {
            this.m = m3;
            new Thread(this, "Friends3").start();
        }
    
        public void run() {
            for (int i = 0; i < s3.length; i++) {
                while (currentSpeaker.get() != 3) delay(100L);
                m.Friend3(s3[i]);
                currentSpeaker.set(1);
            }
        }
    }
    

    I created method delay to make code little clear for reading:

    public static void delay(long t) {
        try {
            Thread.sleep(t);
        } catch (InterruptedException e) {}
    }
    

    Output:

    Hi

    Hy

    Hello

    How are you all?

    I am fine

    I am not fine

    Why what happened

    Is there anything wrong?

    I am very depressed about my online classes

    Yes, We are in a hectic situation but we have to continue our studies and be strong inside

    There is nothing we can do about in this pandemic situation but to study and pray

    I feel too much preassure

    Fave faith in Allah! Eveything will be ok

    Everything will be fine soon

    Yeap I will start praying to Allah that everything comes around