【Java】线程通信wait(),notify(),notifyAll(),sleep()

1.线程通信

线程之间的协同工作
使用两个线程打印 1-100。线程1, 线程2 交替打印

class PrintNumber implements Runnable{
    private int number=1;
    private Object obj = new Object();

    @Override
    public void run() {
        while (true){
            synchronized (obj){
                obj.notify();
                if (number<=100){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+":"+number);
                    number++;
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else break;
            }
        }
    }
}
public class ThreadCom {
    public static void main(String[] args) {
        PrintNumber p = new PrintNumber();
        Thread t1 = new Thread(p);
        Thread t2 = new Thread(p);

        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();
        t2.start();
    }
}

2.涉及到的方法

方法 描述
wait() 使当前线程进入阻塞状态,并释放同步监视器
notify() 唤醒一个被wait()的线程,有多个则唤醒优先级高的。
notifyAll() 唤醒所有被wait()的线程
sleep() 使当前线程进入阻塞状态,同步代码块和同步方法中不会释放锁。

(1)说明

  • wait(),notify(),notifyAll() 这三个方法必须使用在同步代码块或同步方法中(synchronize)。
  • 三个方法的调用者必须是同步代码块或同步方法中的同步监视器,否则会出现 IllegalMonitorStateException 异常。
  • 这三个方法是定义在java.lang.Object类中。

sleep()和wait()的异同

  • 相同点:一旦执行,都可以使当前线程进入阻塞状态。
  • 不同点:
    • 声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
    • 调用的要求不同:sleep()可以在任何需要的场景下调用,wait()必须在同步代码块或同步方法中使用。
    • 是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁。
posted @ 2022-11-17 15:25  植树chen  阅读(28)  评论(0编辑  收藏  举报