/*
* 创建两个线程,交替输出0,1数字
* */
public class NumberChange {
private int num;
public synchronized void incr(){
//使用while不用if条件判断,主要是虚假唤醒
while (num>0){//当前num数大于0则线程等待,否则加1
try {
wait();//线程等待,直到被唤醒,必须写在同步方法或者同步代码块中,在指定的监听器上等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num++;
System.out.println(Thread.currentThread().getName()+"->"+num);
//唤醒减法线程
notifyAll();
}
public synchronized void decr(){
while (num<1){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
num--;
System.out.println(Thread.currentThread().getName()+"->"+num);
//唤醒减法线程
notifyAll();
}
}
测试类为:
public class Test03test {
public static void main(String[] args) {
NumberChange ne = new NumberChange();
for (int i = 0;i<4;i++){
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
ne.incr();
}
}
},"加法法线程"+i).start();
}
for (int i = 0;i<4;i++){
new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
ne.decr();
}
}
},"减法线程"+i).start();
}
}
}