package demo;
/**
* 子线程循环5次,主线程循环10次。依次交替。整个交替循环3次
*
*/
public class ThreadTest {
public static void main(String[] args) {
init();
}
static void init(){
final Print p = new Print();//封装了 循环的动作
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<3;i++){
p.subPrint(5);//循环5次
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<3;i++){
p.mainPrint(10);//循环10次
}
}
}).start();
}
}
Print:
package demo;
/**
* 两个方法之间互斥 (方法里面完整执行完),用 Sflag实现 开关控制 两个方法的切换
*
*/
public class Print {
boolean Sflag = true;
public synchronized void subPrint(int num){
while(!Sflag){//避免 伪唤醒
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=num;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
Sflag = false;
this.notifyAll();
}
public synchronized void mainPrint(int num){
while(Sflag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=num;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
Sflag = true;
this.notifyAll();
}
}