一.使用
class Add implements Runnable
{
static Integer num=0;
Object obj;
public Add(Object obj)
{
this.obj=obj;
}
@Override
public void run() {
synchronized (obj)
{
for (int i=0;i<100;i++)
{
num++;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.notify();
}
}
public static int getNum()
{
return num;
}
}
class Result implements Runnable
{
Object obj;
Result(Object obj)
{
this.obj=obj;
}
@Override
public void run() {
synchronized (obj)
{
while (Add.getNum()!=100)
{
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Result醒了。。。");
}
System.out.println(Add.getNum());
}
}
}
public static void main(String[] args) {
Object obj=new Object();
Add add=new Add(obj);
Result result=new Result(obj);
Thread threadAdd=new Thread(add);
Thread threadResult=new Thread(result);
threadResult.start();
threadAdd.start();
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3d323d4d76ae328fe7f26a31eb313990.png)
二.原理
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cdc943a42c0aa10c1871b52ebbf5fe2b.png)
三.注意点
- 只有加锁后才能调用锁对象的wait/notify方法,如果没有就加锁就调用这些方法会报IllegalMonitorStateException。
- 成功调用锁对象的wait方法后,当前线程会释放锁,进入Monitor的WaitSet中。而调用Thread.sleep()是不会释放锁的。
- wait()可以设置等待时间也可以不设,这两种情况调用wait()后,线程的状态是不一样的。设置等待时间的情况,调用wait()后,线程状态时TIMED_WAITING。不设等待时间,线程状态时WAITING。