三个线程。T1 打印 1,4,7.. 消息序列 T2 打印 2,5,8.. 和 T3 打印 3,6,9.. 如何同步这三个以打印 1-15 消息序列

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);
   }
   }

输出为: 嗨

大家好吗?

我很好

为什么会这样

有什么问题吗?

是的,我们很忙,但我们要继续学习,内心要坚强

疫情之下,我们无能为力,唯有学习祷告

信仰真主!一切都会好的

一切都会好的

你好

在你的情况下,你知道每个线程都应该在前一个之后打印短语:

  • 2 后 1
  • 3 后 2
  • 1 后 3

因此您可以创建变量来存储现在应该执行操作的线程的编号:

AtomicInteger currentSpeaker = new AtomicInteger(1);

每个线程都可以在打印下一个短语之前检查此变量并为下一个线程设置新值:

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);
        }
    }
}

我创建了方法 delay 来让代码更清晰易读:

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

输出:

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