Java多线程学习笔记 - 八、Java中的wait和sleep的区别

本文详细解析了Java中wait(), sleep()和Thread.sleep()的区别,包括它们的用途、调用场景、行为特点和唤醒机制。通过实例演示,理解线程同步在对象锁定和唤醒线程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        简单地说,wait()是一个用于线程同步的实例方法。

        它可以在任何对象上调用,因为它是在java.lang.Object 上定义的,但它只能从同步块调用。它释放对象上的锁,以便另一个线程可以跳入并获取锁。

        另一方面,Thread.sleep()是一个可以从任何上下文调用的静态方法。Thread.sleep()暂停当前线程并且不释放任何锁。

        以下是对这两个核心 API 的初步初步了解:

private static Object LOCK = new Object();

private static void sleepWaitExamples() 
  throws InterruptedException {
 
    Thread.sleep(1000);
    System.out.println(
      "Thread '" + Thread.currentThread().getName() +
      "' is woken after sleeping for 1 second");
 
    synchronized (LOCK) {
        LOCK.wait(1000);
        System.out.println("Object '" + LOCK + "' is woken after" +
          " waiting for 1 second");
    }
}

        运行此示例将产生以下输出:

        1、线程“main”在休眠 1 秒后被唤醒

        2、对象“ java.lang.Object@31befd9f ”在等待 1 秒后被唤醒

        当我们使用sleep()方法时,线程会在指定的时间间隔后启动,除非它被中断。

        对于wait(),唤醒过程有点复杂。我们可以通过调用正在等待的监视器上的notify()notifyAll()方法来唤醒线程。

        当你想唤醒所有处于等待状态的线程时,使用notifyAll()而不是notify() 。与wait()方法本身类似, notify()notifyAll()必须从同步上下文中调用。

        例如,您可以这样等待:

synchronized (b) {
    while (b.sum == 0) {
        System.out.println("Waiting for ThreadB to complete...");
        b.wait();
    }

    System.out.println("ThreadB has completed. " + 
      "Sum from that thread is: " + b.sum);
}

        这是另一个线程如何唤醒等待线程的方法——通过在监视器上调用notify()

int sum;
 
@Override 
public void run() {
    synchronized (this) {
        int i = 0;
        while (i < 100000) {
            sum += i;
            i++; 
        }
        notify(); 
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值