JAVA线程sleep()和wait()详解及实例

JAVA线程sleep()和wait()详解及实例

简介

Java中的线程是轻量级的,同时也是一种几乎可以同时执行多个任务的机制。线程具有并发执行的能力,可以实现复杂的并发操作。线程的任何操作都需要以某种方式调度,由操作系统或JVM负责分配资源,因此线程通常比进程更高效。本文将重点介绍Java线程中的sleep()和wait()方法。

sleep()方法

sleep()方法使当前线程休眠一段时间,时间由程序员指定。调用sleep()方法的线程不会与其他线程交替执行,而是进入阻塞状态。

语法:public static void sleep(long millis) throws InterruptedException

例如,在下面的示例中,将启动两个线程分别打印“Hello”和“World”并休眠一段时间:

public class SleepExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Hello");
                try {
                    Thread.sleep(1000); // 休眠1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("World");
                try {
                    Thread.sleep(1000); // 休眠1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

输出结果:

Hello
World
Hello
World
Hello
World
Hello
World
Hello
World

wait()方法

wait()方法是Object类的方法,它会使当前线程等待,直到其他线程调用notify()或notifyAll()方法唤醒它。因此,wait()方法通常与synchronized关键字一起使用。线程必须拥有对象的锁,才能调用这个对象的wait()方法。

语法:public final void wait() throws InterruptedException

例如,在下面的示例中,创建了一个生产者线程和一个消费者线程,并使用wait()和notify()方法使它们交替地执行:

public class WaitExample {
    public static void main(String[] args) {
        final Object lock = new Object();
        List<Integer> buffer = new ArrayList<>();

        Thread producer = new Thread(() -> {
            int i = 1;
            while (true) {
                synchronized (lock) {
                    if (buffer.size() == 1) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    buffer.add(i);
                    System.out.println("Producer produced - " + i++);
                    lock.notify();
                }
                try {
                    Thread.sleep(1000); // 休眠1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread consumer = new Thread(() -> {
            while (true) {
                synchronized (lock) {
                    if (buffer.size() == 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    int removed = buffer.remove(0);
                    System.out.println("Consumer consumed - " + removed);
                    lock.notify();
                }
                try {
                    Thread.sleep(1000); // 休眠1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

输出结果:

Producer produced - 1
Consumer consumed - 1
Producer produced - 2
Consumer consumed - 2
Producer produced - 3
Consumer consumed - 3
...

总结

本文介绍了Java线程中的sleep()和wait()方法的详细信息以及使用示例。sleep()方法可以使当前线程休眠一段时间,并且不释放锁。wait()方法在等待其他线程调用notify()或notifyAll()时会释放锁,并挂起当前线程。在使用wait()方法时,必须拥有对象的锁。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA线程sleep()和wait()详解及实例 - Python技术站

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

相关文章

  • Java后端真实、靠谱、强大的面试题网站:面试梯

    ​  本文分享一个给力的Java后端面试题网站:面试梯。 网址:https://offer.skyofit.com 这套题真实、高频、全面、有详细答案、保你稳过面试,让你成为offer收割机。题目包括:Java基础、多线程、JVM、数据库、Redis、Shiro、Spring、SpringBoot、MyBatis、MQ、ELK、分布式、SpringCloud…

    Java 2023年5月8日
    00
  • SpringBoot应用整合ELK实现日志收集的示例代码

    ELK是一套开源的日志管理系统,由Elasticsearch、Logstash和Kibana三个组件组成。Spring Boot应用整合ELK可以实现日志收集、分析和可视化展示。以下是Spring Boot应用整合ELK实现日志收集的完整攻略: 添加依赖 在Spring Boot应用中,我们需要添加logstash-logback-encoder和sprin…

    Java 2023年5月15日
    00
  • 什么是类卸载?

    类卸载是Java虚拟机(JVM)中的一项重要功能,它可以卸载运行时的类。在Java应用程序中,当一个类没有被引用时,JVM会自动释放该类所占用的内存。这个过程称为“类卸载”。 类卸载的实现是通过垃圾收集器完成的。在JVM中,垃圾收集器会判断一个类是否完全没有被引用,如果没有引用,则该类不再被使用。当该类不再被使用时,JVM会卸载该类,释放其内存,并将该类从方…

    Java 2023年5月11日
    00
  • 在Java的Struts框架中ONGL表达式的基础使用入门

    对于在Java的Struts框架中ONGl表达式的基础使用入门,我将提供以下攻略: 一、什么是Struts框架 Struts框架是一个基于模型-视图-控制器(MVC)的web应用程序框架。它由Apache软件基金会开发,并且拥有活跃的社区支持和用户。它允许开发人员分离业务逻辑和用户界面,从而使开发人员能够更专注于他们的核心业务。 二、什么是OGNL表达式 O…

    Java 2023年5月20日
    00
  • JAVA十大排序算法之基数排序详解

    JAVA十大排序算法之基数排序详解 基本概念 基数排序是按照低位先排序,也就是先排个位,再排十位,以此类推。这样从最低位开始排序,直到最高位排序完成之后,数列就变成了一个有序序列。 算法步骤 基数排序的过程可以描述如下: 取得数组中的最大数,并取得位数; arr为原始数组,从最低位开始取每个位组成radix数组; 对radix进行计数排序(利用计数排序适用于…

    Java 2023年5月19日
    00
  • java中的前++和后++的区别示例代码详解

    Java中的前++和后++的区别示例代码详解 在Java语言中,++运算符可以表示自增运算符,即对于一个变量,它的值可以通过++运算符来自增1,但是++运算符又可以分为前++和后++两种形式,他们的区别在于运算符的位置。下面我们来详细讲解一下Java中的前++和后++的区别。 前++和后++的区别 前++:先自增,再引用该变量。 后++:先引用该变量,再自增…

    Java 2023年5月23日
    00
  • JAVA实现监测tomcat是否宕机及控制重启的方法

    下面是详细讲解”JAVA实现监测tomcat是否宕机及控制重启的方法”的完整攻略: 1. 监测Tomcat是否宕机 要监测Tomcat是否宕机,可以使用Java自带的Socket库建立Socket连接来判断Tomcat是否还在运行。下面是示例代码: public class TomcatMonitor { // 定义Tomcat的IP和端口 private …

    Java 2023年6月2日
    00
  • SpringBoot 如何自定义请求参数校验

    根据您的需求,我会详细讲解 SpringBoot 如何自定义请求参数校验的完整攻略。 1. 简介 SpringBoot默认使用 Hibernate Validator 作为参数校验的实现库(底层实现其实是 JSR-303 Bean Validation 规范)。在进行参数校验时,我们通常会使用一组预定义好的注解,如:@NotNull、@Min、@Max、@S…

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