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日

相关文章

  • SpringSecurity OAtu2+JWT实现微服务版本的单点登录的示例

    实现微服务版本的单点登录需要结合SpringSecurity、OAuth2和JWT三个技术点。 首先,关于OAuth2的基础概念和流程可以参考我的博客文章:OAuth2授权模式详解。 接下来就是示例说明: 示例1:SpringBoot微服务注册 在OAuth2客户端程序中添加以下依赖: <dependency> <groupId>or…

    Java 2023年6月3日
    00
  • ResHacker怎么替换图标 ResHacker提取并保存avi图文步骤

    以下是关于“ResHacker怎么替换图标 ResHacker提取并保存avi图文步骤”的完整攻略: ResHacker怎么替换图标 如果你想要替换一个程序的图标,可以使用ResHacker工具。 1.首先要打开ResHacker工具,然后在菜单中选择“Open”,并选择要修改的程序。 2.选择要修改的程序后,你需要寻找其中的图标资源。可以通过在左侧的菜单中…

    Java 2023年5月26日
    00
  • javaweb实现投票系统

    实现一个简单的投票系统可以分为以下步骤: 确定需求,设计数据库表结构 首先需要明确系统的功能需求以及相应的数据表结构,如投票主题、投票选项、投票结果等。可以使用MySQL、Oracle等数据库进行设计。 搭建开发环境 选择Eclipse、IntelliJ IDEA等Java开发工具,搭建相应的开发环境,并搭配相应的Web服务器,如Tomcat、Jetty等。…

    Java 2023年5月19日
    00
  • Mybatis三种批量插入数据的方式

    Sure! 首先,我们先了解一下 Mybatis 中三种批量插入数据的方式: 1.基于 statement 的方式2.基于 batch 的方式3.基于 foreach 标签的方式 下面我将详细讲解这三种方式的过程和示例: 基于 statement 的方式 创建一个包含多个 insert 语句的 sql 文件,例如 insert_test.sql 文件如下: …

    Java 2023年5月20日
    00
  • java servlet结合mysql搭建java web开发环境

    概述 在Java Web开发中,结合MySQL数据库使用Java Servlet技术是非常常见的一种方式。本文将给出完整的攻略,演示如何在本地环境下搭建Java Servlet和MySQL结合使用的开发环境,并提供两个示例进行说明。 环境准备 在开始之前需要安装以下组件: JDK Tomcat MySQL 配置Tomcat 下载Tomcat并解压到本地目录(…

    Java 2023年6月16日
    00
  • springboot登陆页面图片验证码简单的web项目实现

    下面我来详细讲解“springboot登陆页面图片验证码简单的web项目实现”的完整攻略。 简介 本项目是一个基于Spring Boot框架的简单web项目,使用图片验证码来保护用户登录页面,防范恶意攻击和爆破。 实现步骤 第一步:新建Spring Boot项目 首先,我们需要新建一个Spring Boot项目,以便进行后续的开发。在创建项目时需要注意选择W…

    Java 2023年5月20日
    00
  • 什么是Java线程池?

    Java线程池是Java提供的一个用于管理和重复使用线程的机制。线程池将一组线程存储在内存中,当需要执行一些任务时,可以分配一个线程来处理任务,以提高性能和资源利用率。 Java线程池的使用攻略: 步骤1:创建一个线程池 Java线程池通常使用Executor工厂类来创建。 Executor提供了许多静态工厂方法来创建不同种类的线程池。其中,最常用的是Exe…

    Java 2023年5月11日
    00
  • Servlet实现文件上传,可多文件上传示例

    Servlet实现文件上传 Servlet是Java Web开发中非常常用的技术,它可以实现各种业务需求。其中,文件上传就是Web开发中非常常见的需求之一。 本文将详细讲解如何通过Servlet实现文件上传功能,并提供多文件上传的示例说明。 实现步骤: 在JSP页面中添加文件上传标签,如下所示: <form action="upload&qu…

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