Java线程中sleep和wait的区别详细介绍

下面详细讲解Java线程中sleep和wait的区别。

sleep和wait的区别

等待方式不同

sleep()方法是线程的静态方法,通过该方法可以使当前线程暂停指定的时间,但不会释放已经持有的锁。wait()方法是Object类中的方法,通过该方法可以使线程等待其它线程通知其被唤醒,同时会释放当前持有的锁。

调用位置不同

sleep()方法可以在任何位置调用,而wait()方法只能在同步块或同步方法中调用。

需要监视器的不同

wait()方法需要在同步块或同步方法中,等待期间依然需要持有监视器,一般在调用wait()前先调用synchronized()方法获取该对象的锁。而sleep()方法不需要持有监视器。

触发操作不同

wait()方法通常通过notify()notifyAll()方法来唤醒该线程,notify()可以唤醒一个等待的线程,notifyAll()可以唤醒所有等待的线程。而sleep()方法会在指定时间后自动唤醒,或者被中断时也会被唤醒。

示例一

public class SleepTest {
    public static void main(String[] args) throws InterruptedException {
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread A is running...");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread A is done.");
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread B is running...");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread B is done.");
            }
        });

        threadA.start();
        threadB.start();
    }
}

输出结果为:

Thread A is running...
Thread B is running...
Thread B is done.
Thread A is done.

其中,线程A执行了sleep()方法,让自己休眠3秒钟,线程B执行了sleep()方法,让自己休眠1秒钟。由于sleep()方法不会释放锁,所以线程A和B都开始执行,后者先执行完成,然后是线程A。

示例二

public class WaitTest {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("Thread A is running...");
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("Thread A is done.");
                }
            }
        });

        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("Thread B is running...");
                    lock.notify();
                    System.out.println("Thread B is done.");
                }
            }
        });

        threadA.start();
        threadB.start();
    }
}

输出结果为:

Thread A is running...
Thread B is running...
Thread B is done.
Thread A is done.

线程A占有了共享对象lock的监视器,进入同步块后进入等待状态,直到接收到notify()信号,被唤醒继续执行。线程B在获得了监视器之后向所有等待的线程发送通知,唤醒了线程A后执行完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程中sleep和wait的区别详细介绍 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java这个名字的来历与优势

    Java是一种流行的编程语言,自1995年以来就一直被广泛采用。它的名字“Java”是由它的创造者詹姆斯·高斯林(James Gosling)与他的团队考虑出来的。Java这个名字的来历与优势的攻略可以分为以下几个方面: Java这个名字的来历 Java最初被命名为Oak。然而,后来由于已有一种名为Oak的编程语言,所以詹姆斯·高斯林和他的团队转而寻找新的名…

    Java 2023年5月24日
    00
  • Java 流处理之收集器详解

    Java 流处理之收集器详解 Java 8 引入了一个新的 Stream API,其中的收集器(Collector)是 Java 8 可以处理流(Stream)中数据的一个关键工具。收集器是指将流中元素转换成不同形式的操作。在本文中,我们将详细介绍 Java 中的收集器。 收集器的基本概念 Java 8 提供了 22 个预定义的收集器。这些收集器和终止操作结…

    Java 2023年5月26日
    00
  • Java生成CSV文件实例详解

    Java生成CSV文件实例详解 什么是CSV文件 CSV (Comma Separated Values),即逗号分隔值文件,是一种纯文本文件,其中数据由单个逗号分隔,用于存储数据表类数据。通常,第一行包含列标题。CSV文件可以在各种软件程序(如Microsoft Excel)之间轻松共享。使用Java程序可以轻松生成CSV文件。 使用Java生成CSV文件…

    Java 2023年5月20日
    00
  • java生成json实现隐藏掉关键属性

    生成 JSON 格式字符串通常使用的是 JSON 序列化器,Java 中最常用的序列化器是 Jackson。要隐藏关键属性,我们可以使用 Jackson 提供的注解 @JsonIgnore,该注解可以标记某个属性在序列化时不进行序列化。 下面是完整的攻略步骤: 步骤一:导入依赖 在 pom.xml 文件中导入 Jackson 相关的依赖。 <depen…

    Java 2023年5月26日
    00
  • OkHttp Address already in use: no further information异常

      说下场景,我的程序在多线程场景下一个循环体中处理业务数据,其中需要调用一个外部http接口去获取一些数据,程序总会在在本地执行一段时间后会抛出Address already in use: no further information错误。   这是大量并发场景下出现的问题,经过查阅原因是OkHttp的链接没有被有效回收和复用导致的端口资源占用,okHt…

    Java 2023年4月18日
    00
  • 使用jdbcTemplate查询返回自定义对象集合代码示例

    下面是“使用jdbcTemplate查询返回自定义对象集合”的完整攻略。 1. 准备工作 在使用jdbcTemplate查询返回自定义对象集合代码前,需要导入相关依赖包: <dependency> <groupId>org.springframework</groupId> <artifactId>spring…

    Java 2023年5月26日
    00
  • 详解SpringBoot Starter作用及原理

    详解SpringBoot Starter作用及原理 简介 Spring Boot Starter简化了Spring Boot应用程序的依赖性管理,并提供了快速启动应用程序所需的所有依赖关系的打包方式。 什么是SpringBoot Starter 在Spring Boot项目开发中,我们可以参考Spring Boot Starter组织的maven工程来进行依…

    Java 2023年5月19日
    00
  • Java实现几种常见排序算法代码

    Java实现几种常见排序算法代码 在本文中,我们将介绍 6 种常见的排序算法的 Java 代码实现,这些排序算法分别是: 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 为了方便说明,我们将在每个排序算法的代码实现中使用一个简单的示例数组 arr,用于展示排序前与排序后的结果。示例代码如下: int[] arr = {5, 2, 8, 3, 9, …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部