详解Java中wait和sleep的区别

yizhihongxing

下面我将为大家详细讲解"详解Java中wait和sleep的区别"的完整攻略。

什么是wait和sleep?

在Java中,wait和sleep都是线程等待的方法。它们的作用都是让程序进入等待状态,但是两者还是有一些区别的。

wait和sleep的区别

  1. wait是Object类的方法,而sleep是Thread类的方法。
  2. 在调用wait的时候,线程会释放它所持有的锁并且进入等待状态,直到其他线程调用notify或者notifyAll方法,才能唤醒这个线程。而sleep会使当前线程进入阻塞状态,但不会释放它所持有的锁。

示例说明

下面分别给大家举两个例子说明一下wait和sleep的区别。

示例1:wait和notify的使用

public class WaitAndNotifyDemo {
    public static void main(String[] args) {
        final Object lock = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + "执行了wait方法");
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "被唤醒了");
                }
            }
        }, "线程1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + "执行了notify方法");
                    lock.notify();
                }
            }
        }, "线程2");

        t1.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }
}

在上面的代码中,我们创建了一个共享锁lock,两个线程t1和t2共享这把锁。t1线程获取到锁之后,执行了wait方法以后,会释放这把锁,进入等待状态,直到t2线程调用notify方法将它唤醒。

示例2:sleep的使用

public class SleepDemo {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + "开始执行");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "执行结束");
    }
}

在上面的代码中,我们让主线程执行了sleep方法,这时主线程会进入阻塞状态,但不会释放它所持有的锁,3秒后再次执行后面的代码。

通过以上的示例可以很清楚地看到wait和sleep的区别。希望本篇攻略能对大家了解wait和sleep的区别有所帮助。

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

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

相关文章

  • vue组件间传值的方法你知道几种

    当我们使用Vue.js框架时,组件和组件间的通信常常需要使用传值方法来完成。下面将介绍Vue组件间传值的多种方法。 Props Props是Vue中一种父子组件传递数据的方式。父组件可以通过标签属性的形式把数据传递给子组件,子组件通过props来接收这些数据。 例如,父组件中这样写: <template> <div> <chil…

    Vue 2023年5月28日
    00
  • 详解Vue如何监测数组的变化

    详解Vue如何监测数组的变化。Vue对数组的变化是有所监测的,包括以下操作:push、pop、shift、unshift、splice、sort、reverse。下面我们对这些操作进行分析: push和pop Vue对于数组的push、pop操作,可以通过观察数组的length属性来监测数组的变化。当进行push或pop操作时,Vue会检测到数组的lengt…

    Vue 2023年5月28日
    00
  • Vue使用electron转换项目成桌面应用方法介绍

    Vue使用Electron转换项目成桌面应用方法介绍 Electron是基于Chromium和Node.js开发的流行桌面应用开发框架,它可以让你使用前端技术(如HTML、CSS和JavaScript)开发出桌面应用。而Vue是一款易用、高效的前端框架,它可以让我们快速构建响应式、可维护的Web应用程序。将二者结合起来,可以让我们更加高效地开发出高质量的桌面…

    Vue 2023年5月28日
    00
  • Vue Object.defineProperty及ProxyVue实现双向数据绑定

    Vue是一款流行的JavaScript框架,它拥有与DOM相关的数据绑定能力。其中,双向数据绑定是Vue框架中最为重要的概念之一。 在Vue中,我们可以通过使用Object.defineProperty()或Proxy方法实现双向数据绑定。这两种方法的实现方式其实很类似,它们都可以通过监听数据变化来实现数据的双向绑定。 Object.defineProper…

    Vue 2023年5月28日
    00
  • vue中更改数组中属性,在页面中不生效的解决方法

    当我们在vue中操作数组时,如果直接更改数组中某个元素的属性值,它并不会立即更新页面。这是因为vue在数据劫持时,只会劫持数组中响应式元素的访问和操作,而不会观察数组元素的属性变化。 要解决这个问题,我们可以使用以下两种方法: 1. 使用$set方法 vue提供了$set方法,用来修改数组中的属性值,并触发响应式更新。$set方法的语法如下: Vue.set…

    Vue 2023年5月29日
    00
  • 使用vue框架 Ajax获取数据列表并用BootStrap显示出来

    下面是使用Vue框架Ajax获取数据列表并用Bootstrap显示出来的攻略: 1. 准备工作 在执行前,我们需要准备以下工作: 一个后端API,提供获取数据的功能 这个API可以使用后端框架比如Node.js的Express框架等来搭建。我们需要实现一个路由,接收Ajax请求,查询数据库中相应的数据并返回给请求者。 安装Vue.js和Bootstrap 我…

    Vue 2023年5月28日
    00
  • vue3 reactive函数用法实战教程

    下面是对“vue3 reactive函数用法实战教程”的详细讲解。 什么是vue3 reactive函数? reactive 是 Vue 3 中新引入的一个 API,用于创建响应式对象。通过 reactive 创建出来的对象,在其属性值发生改变时,会自动触发所依赖的组件进行更新。 reactive 函数怎么用? 使用 reactive 可以将一个普通的 Ja…

    Vue 2023年5月28日
    00
  • Echarts在Taro微信小程序开发中的踩坑记录

    关于“Echarts在Taro微信小程序开发中的踩坑记录”的完整攻略,我会从以下几个方面为您进行详细讲解: 环境搭建 引入Echarts库 Echarts在Taro组件中的使用 Echarts的样式调整 踩坑记录及解决方案 1. 环境搭建 首先,我们需要确保已安装Taro环境。可以使用以下命令进行检查: $ taro info 若未安装,则需要先安装Taro…

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