public class printNum {
static class SoulutionTask implements Runnable{
static int value = 0;
@Override
public void run() {
while (value <= 100){
synchronized (SoulutionTask.class){
System.out.println(Thread.currentThread().getName() + ":" + value++);
SoulutionTask.class.notify();
System.out.println("--------------"+Thread.currentThread().getName() +"-----------");
try {
SoulutionTask.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("#################"+Thread.currentThread().getName() +"################");
}
}
}
}
public static void main(String[] args) {
new Thread(new SoulutionTask(), "偶数").start();
new Thread(new SoulutionTask(), "奇数").start();
}
}
因为偶数的线程先触发,所以对于同步锁来说,当偶数线程进入方法后就进行了代码块锁,这时候奇数线程被禁止访问执行,进入了同步阻塞状态。
当偶数线程执行到notify时,奇数线程被唤醒进入就绪状态,等待执行,当偶数线程执行wait之后就偶数线程就进入了等待阻塞状态,不再继续往后执行。而这时候奇数线程进入了同步代码块段,执行顺序和之前偶数线程执行一致,直到奇数线程自己wait后,偶数线程开始执行wait后的代码,再次进行轮循。
代码运行结果:
偶数:0
--------------偶数-----------
奇数:1
--------------奇数-----------
#################偶数################
偶数:2
--------------偶数-----------
#################奇数################
奇数:3
--------------奇数-----------
#################偶数################
偶数:4
--------------偶数-----------
#################奇数################
奇数:5
--------------奇数-----------
#################偶数################
偶数:6
--------------偶数-----------
#################奇数################
奇数:7
--------------奇数-----------
#################偶数################
偶数:8
--------------偶数-----------
#################奇数################
奇数:9
--------------奇数-----------
#################偶数################