编写一个程序。开启3个线程,这3个线程的ID分别为A、B、C,每一个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

这个问题仍旧是线程间的交替控制问题,分析方法还是能够同上一篇“多线程经典问题1——主线程子线程交替问题”。

详细代码例如以下:

package treadgame;

/**

* 线程间的交流1

* 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,

* 每一个线程将自己的ID在屏幕上打印10遍,

* 要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

* @author lcx

*

*/

public class ThreadExchange2 {

public static void main(String[] args)

{

Resource2 res=new Resource2();

Thread td1=new Thread(new Subs('A',res));

Thread td2=new Thread(new Subs('B',res));

Thread td3=new Thread(new Subs('C',res));

td1.start();

td2.start();

td3.start();

}

}

class Resource2

{

int index=0;

public synchronized void runSub(char tag)

{

for(int i=0;i<10;i++)

{

while(tag-'A'!=index)

{

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.print(tag);

index=(index+1)%3;

notifyAll();

}

}

}

class Subs implements Runnable

{

char tag;

Resource2 res;

public Subs(char tag,Resource2 res)

{

this.tag=tag;

this.res=res;

}

public void run() {

res.runSub(tag);

}

}

必需要注意的是while(tag-'A'!=index)不能写成

if(tag-'A'!=index)否则会出现错误,由于notifyAll会唤醒剩下的两个线程。当中仅仅能有一个是正确的、需要运行的线程

追问:之前说的子线程与主线程交替运行,为什么就能够在使用if来推断是否wait?由于假设本线程不是须要运行的线程。那么另外一个线程绝对是须要运行的线程,所以一个if即可。

查看原文