作用:阻塞线程,必须在同步代码块或同步方法中使用(synchronized())
notify();作用:唤醒被wait()阻塞的线程,必须在同步代码块或同步方法中使用(synchronized())
notifyAll();作用:唤醒所有被阻塞的线程,必须在同步代码块或同步方法中使用(synchronized())
package thread01;
public class ThreadTest01 {
public static void main(String[] args) {
MyThread01 m1 = new MyThread01();
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m1);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
class MyThread01 implements Runnable{
private int number=1;
//Object obj = new Object();
@Override
public void run() {
while(true) {
//synchronized (obj)
synchronized (this){
//唤醒,
this.notify();
//obj.notify();
if (number <= 100) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
//使线程运行到此阻塞
try {
this.wait();//会释放锁
//obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
}
}else {
break;
}}}}}
sleep()和wait()异同
- 同:
一旦执行方法,线程都将进入阻塞状态
- 异:
1.两个方法声明的位置不同;Thread类中声明sleep(),Object类中声明wait()
2.调用的要求的不同:sleep()可以在任何需要的场景下调用。wait()必须在同步代码块或同步方法中使用
3.关于是否调用同步监视器:如果两个方法都使用在同步代码块或同步方法中sleep()不会释放锁,wait()会释放锁



