打印10遍ABCABC
有ABC三个线程,每一个线程打印自己名字,需要打印结果为ABCABC…,打印10遍
循环重复执行的问题
ABC三个线程需要通信,三个线程共用一个对象,自定义一个对象,知道当前是哪个线程执行,下一个通知的执行线程
/**
* 自定义对象
*/
public class Print {
private int index;//当前执行的线程编号 0 1 2
public int getIndex() {
return index;
}
public void setIndex(int i) {
index = i;
}
}
public class ABCThread extends Thread {
private DIYObject object;//线程共享对象,线程间通知也是该对象
private int threadId;//当前线程编号
/**
* 三个线程命名为ABC
* 传递的线程ID为int类型的数据
* name数组下标 0 1 2 分别 A B C
* name[0] = 'A'
* 线程循环使用(threadId+1)% 3
* threadId=0当前(0+1)%3=1 即下一个执行threadID=1 name[1] = b
* threadId=1d (1+1)%3 =2 即threadID = 2 name[2] = c
* threadId =2 (2+1)%3 = 0 即threadID= 0 name[0]=A
*
*/
private String name[] = {"A","B","C"};
public ABCThread(DIYObject o,int id) {
this.object = o;
this.threadId = id;
}
@Override
public void run() {
int num = 10;
while (num-- > 0) {
synchronized (object) {
//先判断通知的是否是当前线程
while (!(threadId == object.getIndex())) {
//循环判断是否当前的线程执行,执行条件:
// 当先线程threadID和即将执行的线程DIYObject.getIndex()相同
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//执行
System.out.print(name[threadId]+" ");
//执行下一个执行的线程ID
object.setIndex((threadId+1)%3);
//通过之其他的两个线程
object.notifyAll();
}
}
}
public static void main(String[] args) {
DIYObject diyObject = new DIYObject();
new ABCThread(diyObject,0).start();
new ABCThread(diyObject,1).start();
new ABCThread(diyObject,2).start();
//启动三个线程
}
}