返回顶部
首页 > 资讯 > 后端开发 > Python >Java详细分析sleep和wait方法有哪些区别
  • 550
分享到

Java详细分析sleep和wait方法有哪些区别

2024-04-02 19:04:59 550人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、sleep和wait方法的区别二、wait方法wait方法的使用wait结束等待的条件三、notify和notifyAll方法一、sleep和wait方法的区别 根本区别:s

一、sleep和wait方法的区别

  • 根本区别:sleep是Thread类中的方法,不会马上进入运行状态,wait是Object类中的方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程
  • 释放同步:sleep会释放cpu,但是sleep不会释放同步锁的资源,wait会释放同步锁资源
  • 使用范围: sleep可以在任何地方使用,但wait只能在synchronized的同步方法或是代码块中使用
  • 异常处理: sleep需要捕获异常,而wait不需要捕获异常

二、wait方法

  • 使当前执行代码的线程进行等待. (把线程放到等待队列中)
  • 释放当前的锁
  • 满足一定条件时被唤醒, 重新尝试获取这个锁.
  • wait 要搭配 synchronized 来使用,脱离 synchronized 使用 wait 会直接抛出异常.

wait方法的使用

wait方法


public class WaitDemo1 {
    public static void main(String[] args) {
        Object lock = new Object();
        Thread t1 = new Thread(() -> {
            System.out.println("线程1开始执行");
            try {
                synchronized (lock) {
                    System.out.println("线程1调用wait方法....");
                    // 无限期的等待状态
                    lock.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程1执行完成");
        }, "线程1");
        t1.start();
    }
}

有参wait线程和无参wait线程


public class WaitDemo2 {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread t1 = new Thread(()->{
            System.out.println("线程1开始执行");
            synchronized (lock1){
                try {
                    lock1.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程1执行完成");
            }
        },"无参wait线程");
        t1.start();
        Thread t2 = new Thread(()->{
            System.out.println("线程2开始执行");
            synchronized (lock2){
                try {
                    lock2.wait(60*60*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程2执行完成");
            }
        },"有参wait线程");
        t2.start();
    }
}

wait结束等待的条件

①其他线程调用该对象的 notify 方法.

②wait 等待时间超时 (wait 方法提供一个带有 timeout 参数的版本, 来指定等待时间).

③其他线程调用该等待线程的 interrupted 方法, 导致 wait 抛出 InterruptedException 异常

三、notify和notifyAll方法

notify 方法只是唤醒某一个等待的线程

  1. 方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其它线程
  2. 如果有多个线程等待,随机挑选一个wait状态的线程
  3. 在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁

notify方法的使用


public class WaitNotifyDemo {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread t1 = new Thread(()->{
            System.out.println("线程1开始执行");
            try {
                synchronized (lock1) {
                    System.out.println("线程1调用wait方法");
                    lock1.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程1执行完成");
        },"线程1");
        Thread t2 = new Thread(()->{
            System.out.println("线程2开始执行");
            try {
                synchronized (lock1) {
                    System.out.println("线程2调用wait方法");
                    lock1.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程2执行完成");
        },"线程2");
        t1.start();
        t2.start();
        // 唤醒 lock1 对象上休眠的线程的(随机唤醒一个)
        Thread t3 = new Thread(()->{
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程3开始执行");
            synchronized (lock1){
                //发出唤醒通知
                System.out.println("执行了唤醒");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"线程3");
        t3.start();
    }
}

notifyAll方法可以一次唤醒所有的等待线程

notifyAll方法的使用


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

        new Thread(() -> {
            System.out.println("线程1:开始执行");
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程1:执行完成");
            }
        }, "无参wait线程").start();

        new Thread(() -> {
            synchronized (lock) {
                System.out.println("线程2:开始执行 |" + LocalDateTime.now());
                try {
                    lock.wait(60 * 60 * 60 * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程2:执行完成 | " + LocalDateTime.now());
            }
        }, "有参wait线程").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock) {
                System.out.println("唤醒所有线程");
                lock.notifyAll();
            }
        }).start();
    }
}

notify和notifyAll方法的区别

  1. 当你调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,这取决于线程调度器。
  2. 调用notifyAll方法,那么等待该锁的所有线程都会被唤醒,但是在执行剩余的代码之前,所有被唤醒的线程都将争夺锁定,这就是为什么在循环上调用wait,因为如果多个线程被唤醒,那么线程是将获得锁定将首先执行,它可能会重置等待条件,这将迫使后续线程等待。
  3. 因此,notify和notifyAll之间的关键区别在于notify()只会唤醒一个线程,而notifyAll方法将唤醒所有线程。

到此这篇关于Java详细分析sleep和wait方法有哪些区别的文章就介绍到这了,更多相关Java sleep与wait内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java详细分析sleep和wait方法有哪些区别

本文链接: https://lsjlt.com/news/147344.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java详细分析sleep和wait方法有哪些区别
    目录一、sleep和wait方法的区别二、wait方法wait方法的使用wait结束等待的条件三、notify和notifyAll方法一、sleep和wait方法的区别 根本区别:s...
    99+
    2024-04-02
  • java中sleep()和wait()的区别有哪些
    这篇文章主要介绍java中sleep()和wait()的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;...
    99+
    2023-06-14
  • java线程sleep和wait的区别有哪些
    Java中的线程sleep和wait方法有以下区别:1. 调用wait方法的线程会放弃自己的锁,并进入等待状态,直到其他线程调用相同...
    99+
    2023-09-25
    java
  • Java中sleep和wait方法有什么区别
    本篇内容主要讲解“Java中sleep和wait方法有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中sleep和wait方法有什么区别”吧!一、sleep和wait方法的区别根...
    99+
    2023-06-30
  • java中sleep()和wait()有什么区别
    这篇文章主要介绍java中sleep()和wait()有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统...
    99+
    2023-06-14
  • java面试突击之sleep和wait有什么区别详析
    目录前言区别一:语法使用不同区别二:所属类不同区别三:唤醒方式不同区别四:释放锁资源不同sleep 不释放锁wait 释放锁区别五:线程进入状态不同总结前言 sleep 方法和 wa...
    99+
    2024-04-02
  • java中sleep方法和wait方法的五个区别
    目录区别一:语法使用不同区别二:所属类不同区别三:唤醒方式不同区别四:释放锁资源不同sleep 不释放锁wait 释放锁区别五:线程进入状态不同总结前言: sleep 方法和 wai...
    99+
    2024-04-02
  • 在Java中sleep()和wait()有什么区别
    Java中sleep()和wait()的区别:sleep()是线程类的静态方法,而wait()是Object类的方法。Sleep()可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断,而Wait()可以...
    99+
    2024-04-02
  • java中sleep()和yield()有哪些区别
    这篇文章主要介绍了java中sleep()和yield()有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。4 sleep()和yield()的区别1) sleep()...
    99+
    2023-06-03
  • java中yield()和sleep()的区别有哪些
    这篇文章将为大家详细讲解有关java中yield()和sleep()的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-15
  • java 方法和函数的区别有哪些
    面向对象的语言叫方法,面向过程的语言叫函数。在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。一句话告诉你如何区分函数与方法:函数是大家的函数,方法是类的方法。如何区分一个ITer...
    99+
    2014-07-09
    java教程 java 方法 函数 区别
  • Java详细解析==和equals的区别
    目录1、== 解析2、equals 方法解析3、equals方法具有以下特性1、== 解析 == 常用于相同的基本数据类型之间的比较,也可用于相同类型的对象之间的比较; 如...
    99+
    2024-04-02
  • 浅析Python与Java和C之间有哪些细微区别
    目录1.变量是什么(1)C认为变量应该是容器(2)Python认为变量应该是标签(3)Java认为我们不应该关心这个问题2.循环与迭代(1)传统的循环(2)继承与发展(3)新的问题3...
    99+
    2024-04-02
  • java中wait方法有哪些特点
    在Java中,wait()方法有以下几个特点: wait()方法必须在同步方法或同步块中被调用,即在synchronized关键...
    99+
    2024-03-08
    java
  • Java多线程wait()和notify()方法详细图解
    目录一、线程间等待与唤醒机制二、等待方法wait()三、唤醒方法notify()四、关于wait和notify内部等待问题(重要)五、完整代码(仅供测试用)总结一、线程间等待与唤醒机...
    99+
    2022-11-13
    多线程wait notify 线程的wait和notify 线程notify和wait区别
  • Java中构造器和方法有哪些区别
    小编给大家分享一下Java中构造器和方法有哪些区别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!要学习Java,你必须理解构造器。因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆。但是,构造器和方法又有很多重要的区...
    99+
    2023-06-03
  • php构造方法和java构造方法有哪些区别
    这篇文章主要介绍“php构造方法和java构造方法有哪些区别”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php构造方法和java构造方法有哪些区别”文章能帮助大家解决问题。区别:1、重写子类构造函...
    99+
    2023-06-29
  • Java getRealPath("/")与getContextPath()区别详细分析
    一.以下是在servlet中测试的。 二.运行结果如下(其中myfile文件夹是不存在的)。 三.总结。 1.getRealPath("/")方法返回的是项目在服务器的绝对路径,...
    99+
    2024-04-02
  • php和java区别有哪些
    php和java区别有:1、java适合于开发大型的应用系统,而php适合于快速开发中小型应用系统;2、java通过JDBC来访问数据库,而php则是根据不同的数据库采用不同的数据库访问接口;3、在开发上php比较快,能够做到即写即用,而j...
    99+
    2024-04-02
  • java和javascript有哪些区别
    小编给大家分享一下java和javascript有哪些区别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。区...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作