目录
更多示例代码请看我的其他博客或GitHub。不定期更新,学习过程中用到就写到哪里,作为模板供以后使用和复习。
简介
wait方法和notify方法,并不是Thread线程上的方法,它们是Object上的方法。
因为所有的Object都可以被用来作为同步对象,所以准确的讲,wait和notify是同步对象上的方法。
wait()的意思是: 让占用了这个同步对象的线程,临时释放当前的占用,并且等待。这里的等待是原地等待,线程虽然交出了同步对象的占有权,但本身的执行还是停在了synchronized(object)代码块内,并没有跳出同步代码块,就是说本该是不可被中断的synchronized(object){}代码块,因为wait()被其他线程中断了。这里举例用的是synchronized同步方式,其他同步方式类似。 调用wait是有前提条件的,一定是在synchronized块里,否则就会出错。
notify() 的意思是,通知一个等待在这个同步对象上的线程,你可以苏醒过来了,有机会重新占用当前对象并继续在断点处执行了。
notifyAll() 的意思是,通知所有的等待在这个同步对象上的线程,你们可以苏醒过来了,有机会重新占用当前对象并继续在断点处执行了。
示例代码
public class WaitAndNotify {
public static void main(String[] args) throws InterruptedException {
WaitAndNotify wn = new WaitAndNotify();
wn.test();
}
static int count = 5;
public void test() throws InterruptedException {
// 作为同步对象
Object obj = new Object();
// 添加一个线程
Thread t1 = new Thread("加数线程") {
@Override
public void run() {
// synchronized(object){}代码块
while (true) {
synchronized (obj) {
try {
while (count < 10) {
count++;
System.out.println(this.getName() + "+count:" + count);
sleep(1000);
}
obj.notify();
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};
Thread t2 = new Thread("减数线程") {
@Override
public void run() {
// synchronized(object){}代码块
while (true) {
synchronized (obj) {
try {
while (count > 5) {
count--;
System.out.println(this.getName() + "-count:" + count);
sleep(1000);
}
obj.notify();
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};
t1.start();
t2.start();
}
}
参考资源: