Java线程阻塞方法sleep()与wait()的全面讲解

Java线程阻塞方法sleep()与wait()的全面讲解

简介

在Java多线程编程中,线程状态的控制是非常重要的一个部分。线程可以处于多种状态,例如就绪状态,运行状态,阻塞状态等等。本篇文章主要讲解Java线程阻塞方法sleep()与wait()的使用和区别。

sleep()方法

sleep()方法是Thread类中一个静态方法。sleep()方法的作用是使当前线程暂停执行一段时间,然后再继续执行。sleep()方法接受一个参数,表示休眠的时间的毫秒数。这个参数可以是long类型的,也可以是int类型的。

try {
    Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

在上面的示例中,当线程执行到sleep()方法时,这个线程就会进入睡眠状态,并且暂停执行1秒钟。在1秒钟之后,这个线程会醒来,继续往下执行。

需要注意的是,在调用sleep()方法时,需要处理InterruptedException异常。如果在休眠过程中,调用Thread.interrupt()方法中断了这个线程,那么sleep()方法就会抛出这个异常。

wait()方法

wait()方法是Object类中的一个方法。wait()方法的作用是使当前线程进入等待状态,等待其他线程通过notify()或notifyAll()方法唤醒它。wait()方法可以接受一个参数,表示等待的时间的毫秒数,也可以不传参数。

synchronized (lock) {
    try {
        lock.wait(); // 等待其他线程唤醒
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

在上面的示例中,synchronized锁住了一个对象lock,然后在这个对象上调用了wait()方法。这个线程就会进入等待状态,并且释放锁。等待其他线程调用lock.notify()方法唤醒它。

需要注意的是,在调用wait()方法时,需要先获取synchronized锁,即wait()方法必须在synchronized块中调用,否则会抛出IllegalMonitorStateException异常。

区别

  • wait()方法必须在synchronized块中调用,而sleep()方法不需要。
  • wait()方法会释放锁,而sleep()方法不会释放锁。
  • wait()方法只有在被其他线程调用notify()或notifyAll()方法时才会继续执行,而sleep()方法会在规定的时间后自动醒来继续执行。

示例

示例一:使用sleep()方法

public class SleepDemo {

    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("线程" + Thread.currentThread().getName() + "执行第" + i + "次任务");
                try {
                    Thread.sleep(1000); // 暂停1秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        new Thread(task, "A").start();
        new Thread(task, "B").start();
    }
}

在上面的示例中,创建了两个线程并行执行,每个线程都会执行10次任务,每次任务之间暂停1秒钟。虽然两个线程中的任务不是完全同步的,但是它们是交替执行的。

示例二:使用wait()方法

public class WaitDemo {
    private static final Object lock = new Object();

    public static void main(String[] args) {
        Runnable task1 = () -> {
            synchronized (lock) {
                System.out.println(Thread.currentThread().getName() + "开始执行");
                try {
                    lock.wait(); // 等待唤醒,释放锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "继续执行");
            }
        };

        Runnable task2 = () -> {
            synchronized (lock) {
                System.out.println(Thread.currentThread().getName() + "开始执行");
                lock.notify(); // 唤醒等待线程
                System.out.println(Thread.currentThread().getName() + "唤醒线程");
            }
        };

        new Thread(task1, "A").start();
        new Thread(task2, "B").start();
    }
}

在上面的示例中,创建了两个线程并行执行,线程A会先获得锁并进入等待状态,线程B会在执行过程中唤醒线程A。唤醒线程A会释放锁,线程B会获得锁并继续执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程阻塞方法sleep()与wait()的全面讲解 - Python技术站

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

相关文章

  • 一文带你弄懂Java中线程池的原理

    一文带你弄懂Java中线程池的原理 线程池的概念 线程池是指一组预先创建好的线程,可以被程序反复使用,用于执行多个任务。线程池的好处在于可以管理线程数量、重用线程以及减少线程创建和销毁的开销。 在Java中,线程池相关的类都位于java.util.concurrent包中。 线程池的组成 线程池主要由以下几个组成部分: 线程池管理器(ThreadPoolEx…

    Java 2023年5月19日
    00
  • Java 数组差集实例代码

    当我们需要对两个数组进行差集运算时,就需要使用到Java的数组差集操作。下面是Java 数组差集实例代码的完整攻略: 1. 定义两个数组 假设有两个数组A和B,我们需要求它们的差集。因此,首先需要定义这两个数组。可以使用以下示例代码: int[] A = {1, 2, 3, 4, 5}; int[] B = {3, 4, 5, 6, 7}; 2. 寻找差集 …

    Java 2023年5月26日
    00
  • SSH框架网上商城项目第4战之EasyUI菜单的实现

    SSH框架网上商城项目第4战之EasyUI菜单的实现攻略 1. 前置条件 已经配置好SSH框架,并成功部署网上商城项目。 已经引入EasyUI库文件。 2. 实现步骤 2.1 HTML页面中添加菜单代码 在HTML页面的菜单区域添加以下代码: <div id="menu" class="easyui-tree" …

    Java 2023年6月15日
    00
  • java8新特性 stream流的方式遍历集合和数组操作

    Java 8引入了Stream API,Stream是一种数据处理流程,可以进行筛选、排序、聚合等操作。相比于旧的集合遍历方式,Stream使得代码更加简洁、灵活并且易于并行处理大数据量。 1. Stream简介 1.1 什么是Stream Stream是Java 8引入的一个新API,它允许我们以声明式的方式遍历集合、数组等数据源,把复杂的操作串起来,形成…

    Java 2023年5月26日
    00
  • 理解java多线程中ExecutorService使用

    接下来我会为你详细讲解 “理解Java多线程中ExecutorService使用”的完整攻略。 1. ExecutorService 是什么? ExecutorService 接口是 Java 并发 API 提供的一个线程池管理器。它可以管理一个池子中的线程数量,也可以通过合理配置线程池中的参数,来提高系统的吞吐量和性能。 2. ExecutorServic…

    Java 2023年5月26日
    00
  • Mybatis-Plus和Mybatis的区别详解

    Mybatis-Plus和Mybatis的区别详解 概述 Mybatis是一款比较流行的ORM框架,它的主要作用就是帮助我们完成ORM映射,让我们可以通过SQL直接对数据库进行操作。Mybatis-Plus是Mybatis的增强工具,在Mybatis的基础上,提供了一些强大的功能,使得我们使用Mybatis时能够更加方便、快捷地进行CRUD操作,同时还能提供…

    Java 2023年5月20日
    00
  • Java中的OpenJDK使用原理

    Java中的OpenJDK使用原理 OpenJDK是一个免费开源的Java开发工具包,由于其免费且开源的特性,越来越多的Java开发者开始使用OpenJDK,那么如何使用OpenJDK呢?下面是详细的使用攻略: 安装OpenJDK 在使用OpenJDK之前,需要先安装OpenJDK,下面以CentOS 7为例,介绍安装OpenJDK的方法(其他系统可以自行搜…

    Java 2023年5月19日
    00
  • java使用Hex编码解码实现Aes加密解密功能示例

    下面就来详细讲解”java使用Hex编码解码实现Aes加密解密功能示例”的完整攻略。 简介 在现代加密算法中,AES是目前最常用的对称加密算法,其加密解密速度快,安全性高,在实际应用中得到了广泛的应用。而Hex编码是将二进制转化为可读的十六进制字符表示的编码方式,用于数据传输或者存储。本文将介绍如何通过java使用Hex编码解码实现AES加密解密功能,该方法…

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