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

问题描述

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

输出是:嗨

你们好吗?

我没事

为什么发生了什么

有什么不对的吗?

是的,我们处于忙碌的状态,但我们必须继续学习,内心强大

在这种大流行的情况下,我们无能为力,只能学习和祈祷

信仰真主!一切都会好的

一切都会很快好起来的

你好

标签: javamultithreadingsynchronous

解决方案


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

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

我创建了方法延迟以使代码难以阅读:

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

输出:

你好

你好

你们好吗?

我没事

我不好

为什么发生了什么

有什么不对的吗?

我对我的在线课程感到非常沮丧

是的,我们处于忙碌的状态,但我们必须继续学习,内心强大

在这种大流行的情况下,我们无能为力,只能学习和祈祷

我感到压力太大

信仰真主!一切都会好的

一切都会很快好起来的

是的,我将开始向真主祈祷一切都会到来


推荐阅读