如有错误或不妥,欢迎批评指正,谢谢
package com.newandroid.www.demo2;
/**
* 首先,注意,首先要明确,明确!:
* wait(),notify(),notifyAll(),这几个方法只能被同步监听锁对象来调用,
* 即:线程们所共同操作的那个对象,而不是线程自己调用这些方法。
* 因为这些方法都是非静态的,所以要有线程们所共同操作的那个对象。
*
* 1.调用被操作对象的wait会使当前线程进入等待状态,从字面可以看出是等待的意思,
* 当有线程调用被操作对象的notify或者notifyAll的方法时,再次恢复工作状态
*
* 2.下面的简单的demo中,标志位flag的作用是,防止线程1和线程2同时进入wait()状态,
* 不然就都在等待而不会工作了。
*/
public class Test3 {
static Test3 test3 = new Test3();
private boolean flag = true;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test3.method1();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true){
test3.mothod2();
}
}
}).start();
}
public synchronized void method1(){
try {
//flag为true的时候输出,
if (!flag){
this.wait();
}
flag = false;//将flag置为false,是为了方便线程2被唤醒后开始工作,不然线程2还会被wait()
System.out.println("Thread111111111111");
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void mothod2(){
try {
//flag为false的时候输出,
if(flag){
this.wait();
}
flag = true;//将flag置为true,是为了方便线程1被唤醒后开始工作,不然线程1还会被wait()
System.out.println("Thread2222222222222222222222222222222222222222222222");
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}