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 Spring Security认证与授权及注销和权限控制篇综合解析

    Java Spring Security认证与授权及注销和权限控制篇综合解析 什么是Java Spring Security? Spring Security是一个基于Spring框架的安全性框架,目的是为了帮助开发者构建安全性的应用。它提供了诸如认证,授权,攻击防御等安全特性。 认证 Spring Security 认证提供了选择、实现不同的认证方式。本节…

    Java 2023年5月20日
    00
  • SpringSecurity学习之自定义过滤器的实现代码

    我会尽力详细讲解。 首先介绍一下Spring Security,它是一个开源框架,用于为基于Spring的应用程序提供身份验证和授权管理功能。Spring Security是一个功能强大,使用广泛的安全框架,已经成为企业级应用领域的标准选择之一。本文将通过实战示例,详细讲解如何在Spring Security中自定义过滤器。 1. 自定义过滤器的概念 在Sp…

    Java 2023年5月20日
    00
  • 分析mybatis运行原理

    下面我会为你详细讲解“分析MyBatis运行原理”的攻略。 MyBatis的概述 MyBatis是一款开源的持久层框架,它的主要作用就是帮助开发人员将数据库中的数据映射到Java对象中。 MyBatis在执行时,首先读取配置文件(mybatis-config.xml),通过配置文件解析器解析配置信息,然后创建SqlSessionFactory对象,创建Sql…

    Java 2023年5月20日
    00
  • 详解SpringBoot中关于%2e的Trick

    详解Spring Boot中关于%2e的Trick 在Spring Boot中,我们可以使用%2e来绕过一些安全限制,例如访问受保护的目录或文件。在本文中,我们将详细讲解如何使用%2e的Trick,包括如何访问受保护的目录和如何执行任意命令。 访问受保护的目录 在Spring Boot中,我们可以使用%2e来绕过一些安全限制,例如访问受保护的目录。以下是一个…

    Java 2023年5月15日
    00
  • jfreechart插件将数据展示成饼状图、柱状图和折线图

    首先,我们需要了解一下jfreechart是什么。jfreechart是一个开源的java图表库,可以帮我们生成各种类型的图表比如折线图、柱状图和饼状图等。以下是使用jfreechart插件将数据展示成饼状图、柱状图和折线图的步骤: 准备工作 在使用jfreechart插件之前,我们需要准备一些工作,如导入相关的依赖和引入相应的类。 依赖导入: <de…

    Java 2023年6月15日
    00
  • Spring Boot JPA如何把ORM统一起来

    使用Spring Boot + JPA进行开发可以避免繁琐的ORM操作,让开发更加简单和高效。接下来,我们将详细讲解如何把ORM统一起来,包括定义实体类、配置数据源、定义Repository接口、使用JPA进行CRUD操作等步骤。同时,我们也会给出两个具体的示例供参考。 1. 定义实体类 ORM操作的前提是要定义实体类,对应数据库的表。实体类应该使用Java…

    Java 2023年5月20日
    00
  • Java实现简单登陆界面

    想要实现Java实现简单登录界面,需要遵循以下步骤: 步骤一:创建Java项目 在IDE中,创建一个Java项目(比如使用Eclipse),并选择创建一个Java程序。该程序将成为登录界面的入口。 步骤二:设计登录界面 使用Swing或JavaFX等Java GUI库,设计登录界面的界面元素。例如,需要一个文本框来输入用户名,一个密码框来输入密码,还需要一个…

    Java 2023年5月18日
    00
  • Java+Selenium实现控制浏览器的启动选项Options

    一、关于Java+SeleniumJava+Selenium是用于Web应用程序自动化测试的最流行的工具组合。 Selenium支持大多数浏览器,并且具有简单易用的API。 二、控制浏览器的启动选项Options当使用Java+Selenium进行Web自动化测试时,我们可以通过控制浏览器的启动选项Options来更改浏览器的一些默认设置,例如窗口大小、启动…

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