英文:
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);
}
}
输出结果:
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
英文:
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
答案1
得分: 1
在您的情况下,您知道每个线程都应该在前一个线程之后打印短语:
- 在 1 之后是 2
- 在 2 之后是 3
- 在 3 之后是 1
因此,您可以创建一个变量,用于存储当前应该执行动作的线程编号:
AtomicInteger currentSpeaker = new AtomicInteger(1);
每个线程在打印下一个短语之前可以检查此变量,并为下一个线程设置新的值:
public class T1 implements Runnable {
// ... 线程内部的其他代码 ...
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 {
// ... 线程内部的其他代码 ...
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 {
// ... 线程内部的其他代码 ...
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
英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论