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 annotation入门基础

    JAVA annotation入门基础 什么是Annotation? Annotation 是Java5.0引入的注解机制,它提供了一种注释程序的方法,这些注释可以在编译期,类加载期或者运行期被读取和处理。Annotation 可以看作是程序中的元数据,它提供数据给程序员,让程序员在编写程序时能够更加充分地利用Java语言的特性。Annotation 是Ja…

    Java 2023年5月26日
    00
  • 浅谈servlet中的request与response

    关于“浅谈servlet中的request与response”,下面我来详细讲解一下。 什么是servlet中的request和response 在servlet中,request和response是指HTTP请求和响应中的对象,是Servlet API的一部分。这两个对象扮演了重要的角色,它们是处理HTTP请求和生成HTTP响应的必经之路。 具体而言,re…

    Java 2023年6月16日
    00
  • java hibernate使用注解来定义联合主键

    下面是Java Hibernate使用注解来定义联合主键的完整攻略。 什么是联合主键? 在关系型数据库中,主键是用来唯一标识一条记录的,而联合主键(Compound Primary Key)是由多个字段组合而成的,用来唯一标识一条记录。在Java Hibernate中,定义联合主键可以使用注解来实现。 使用注解定义联合主键 定义实体类 在Java代码中定义需…

    Java 2023年5月19日
    00
  • Java流程控制语句最全汇总(下篇)

    下面是Java流程控制语句最全汇总(下篇)的详细攻略: 1. continue语句 continue语句用于结束本次循环并跳过剩余循环体内的语句,进入下一次循环。其语法格式为: continue; 示例说明: for(int i=0; i<5; i++){ if(i==2){ continue; } System.out.println(i); } 运…

    Java 2023年5月23日
    00
  • SpringBoot 自定义注解实现涉密字段脱敏

    下面是关于“SpringBoot 自定义注解实现涉密字段脱敏”的完整攻略。 目录 需求分析 脱敏实现思路 注解类编写 注解使用及脱敏处理 测试示例1 测试示例2 需求分析 现实生活中,很多敏感信息,如用户的身份信息、密码等,为了保障用户数据的安全,需要进行脱敏处理。本文将实现一个自定义的注解,用于对敏感信息进行脱敏处理。 脱敏实现思路 脱敏处理的方法有很多,…

    Java 2023年5月20日
    00
  • Springmvc中的转发重定向和拦截器的示例

    下面是关于”Springmvc中的转发重定向和拦截器”的详细攻略: 1. 转发和重定向 1.1 转发 转发是指在当前请求的处理过程中,在服务器端直接将请求转发到指定的页面或控制器,由被转发的目标页面或控制器进行处理和响应。在Springmvc中,转发通常通过forward关键字实现,如下所示: @RequestMapping("/forward&q…

    Java 2023年6月15日
    00
  • asp.net清空Cookie的两种方法

    下面是详细讲解“asp.net清空Cookie的两种方法”的完整攻略。 asp.net清空Cookie的两种方法 在asp.net开发中,我们常常需要清空Cookie。下面介绍两种常用的清空Cookie的方法。 方法一:设置过期时间为当前时间 可以将Cookie的过期时间设置为当前时间来删除Cookie。 HttpCookie cookie = Reques…

    Java 2023年6月16日
    00
  • 常见的java面试题

    常见的Java面试题攻略 一. Java基础 1. 什么是Java? Java是一门基于类的、面向对象的编程语言,由Sun Microsystems公司于1995年发布。Java跨平台、安全性高、易于学习等特点使它成为一门广泛使用的编程语言。 2. int和Integer有何区别? int是Java的原始数据类型,它的值由32位的二进制数字表示。而Integ…

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