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实现快速并查集的完整攻略。 什么是并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。并查集的进阶版可以使用路径压缩和按秩合并的算法,使时间复杂度更加优秀。 Java实现快速并查集 下面我们将通过一个完整的Java实现过程,来详细讲解如何实现一个快…

    Java 2023年5月19日
    00
  • IDEA2020.1.2创建web项目配置Tomcat的详细教程

    下面给您讲解详细的“IDEA2020.1.2创建web项目配置Tomcat的详细教程”攻略。 步骤一:安装Tomcat 在安装Tomcat之前,必须先确认JDK是否安装成功,因为Tomcat是依赖于JDK的,若JDK未安装则需要先安装JDK。可在官网上下载Tomcat安装包,解压到指定目录即可。 步骤二:创建WEB项目 1.打开Intellij IDEA,选…

    Java 2023年6月16日
    00
  • Java的Struts框架报错“ValidationException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ValidationException”错误。这个错误通常由以下原因之一起: 表单验证失败:如果表单验证失败,则可能会出现此错误。在这种情况下,需要检查表单验证规则以解决此问题。 配置错误:如果配置文件中没有正确配置,则可能会现此错误。在这种情况下,检查文件以解决此问题。 以下是两个实例: 例 1 如果表单验证…

    Java 2023年5月5日
    00
  • SpringSecurity实现动态加载权限信息的方法

    实现动态加载权限信息的方法是Spring Security中非常重要的一部分,可以根据用户的动态信息进行精确的授权管理。下面是详细的实现攻略。 1. 编写权限信息源的代码 Spring Security中支持自定义的权限信息源,我们需要实现 org.springframework.security.access.vote.RoleVoter 接口并提供动态的…

    Java 2023年5月20日
    00
  • 详解使用Spring Security OAuth 实现OAuth 2.0 授权

    详解使用Spring Security OAuth 实现OAuth 2.0 授权 什么是OAuth 2.0? OAuth 2.0是用于授权的标准协议,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或者将所有的数据转移到第三方应用。 Spring Security OAuth2 Spring Securit…

    Java 2023年5月20日
    00
  • javaweb中Filter(过滤器)的常见应用

    下面是“javaweb中Filter(过滤器)的常见应用”的完整攻略。 一、Filter(过滤器)的简介 Filter(过滤器)是JavaWeb中的一种动态Web组件,它可以拦截客户端和服务器之间的请求、响应,对它们进行预处理和后处理,从而起到了对请求和响应进行过滤的作用。 Filter(过滤器)位于请求和响应之间,可以截获客户端请求和服务器响应,Filte…

    Java 2023年5月20日
    00
  • Java基于Socket的文件传输实现方法

    Java基于Socket的文件传输实现方法 本篇攻略将介绍如何使用Java基于Socket实现文件传输的方法。通过该方法,可以实现发送方向接收方快速传输文件的目的。 准备工作 在进行文件传输前,需要准备的工作如下: 两台运行Java的计算机,分别充当发送方和接收方。 已处于同一网络下。 具备Java编程能力。 实现步骤 创建发送方和接收方的Socket对象。…

    Java 2023年5月19日
    00
  • hadoop 全面解读自定义分区

    Hadoop 全面解读自定义分区 什么是分区 在 Hadoop 中,分区是指在将数据写入到 HDFS 中时,对数据进行分类以便于管理。在每个分区中,都包含了一部分数据,每个分区都有一个固定的编号。 默认分区 当我们使用 Hadoop 内置的 MR 程序时,所有的数据都将会按照默认的哈希分区规则进行分区。一般情况下,分区的数量是由系统自动计算的。 自定义分区 …

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