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

yizhihongxing

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日

相关文章

  • 使用JVM常用GC日志打印参数

    使用JVM常用GC日志打印参数的攻略如下: 1. 为何需要 GC 日志? 在应用程序运行时,JVM 会管理内存。当内存不足时,JVM 需要回收一些不再使用的对象,以释放内存空间,这个过程被称为垃圾回收(GC)。 监控和调优垃圾回收是一项非常重要的任务。为了实现这个任务,JVM 提供了一种功能,即输出 GC 日志。通过观察 GC 日志,我们可以获取关于堆的使用…

    Java 2023年5月26日
    00
  • JAVA按字节读取文件的简单实例

    下面是“JAVA按字节读取文件的简单实例”的攻略: 简介 在Java中,可以通过字节流的方式读取文件,即逐个字节地读取文件中的内容。这种方式对于某些特殊情况下的文件操作非常有用。本文将展示Java中如何使用字节流读取文件的简单实例。 步骤 1. 创建File对象 首先,需要创建一个File对象。可以通过File类的构造函数来实现。 File file = n…

    Java 2023年5月19日
    00
  • Java异常继承结构解析_动力节点Java学院整理

    Java异常继承结构解析 异常概述 在Java语言中,异常分为两种:检查异常和非检查异常。 检查异常,也叫已检查异常,是指Java编译器在编译时会检查的异常,而且这种异常要么被捕获,要么被声明抛出。 非检查异常,也叫未检查异常,是指Java编译器不检查的异常。这种异常通常是由程序逻辑而不是语法错误引起的,比如空指针异常、类型转换异常等。 Java中的所有异常…

    Java 2023年5月26日
    00
  • 解决SpringBoot中MultipartResolver和ServletFileUpload的冲突问题

    问题描述: 在使用SpringBoot开发Web应用时,如果同时使用了SpringMVC和Apache Commons File-Upload的ServletFileUpload类,就会导致MultipartResolver和ServletFileUpload的冲突问题。具体表现为上传文件时出现异常,上传文件的功能无法正常使用。 原因分析: Multipar…

    Java 2023年6月15日
    00
  • Java实现将类数据逐行写入CSV文件的方法详解

    下面是详细讲解“Java实现将类数据逐行写入CSV文件的方法详解”的完整攻略。 什么是CSV文件 CSV(Comma Separated Values)即逗号分隔值,是一种常见的在电子表格和数据库中使用的文本文件格式。每一行表示一条记录,每条记录里的各字段之间使用逗号(或其他分隔符)隔开。 操作步骤 创建CSVWriter对象 Java中可以使用第三方库op…

    Java 2023年5月19日
    00
  • Java上传文件错误java.lang.NoSuchMethodException的解决办法

    Java上传文件时,可能会出现java.lang.NoSuchMethodException错误,这通常是由于使用了错误的MultipartResolver解析器所致。下面是解决此问题的完整攻略: 1. 确认Spring版本 首先,确认你的Spring版本是否能够支持MultipartResolver解析器。MultipartResolver解析器的支持是从…

    Java 2023年5月25日
    00
  • Java基础之面向对象机制(多态、继承)底层实现

    Java基础之面向对象机制(多态、继承)底层实现 Java作为一种面向对象的语言,通过多态和继承两种机制来实现面向对象的特性。本文将从底层角度分别探究多态和继承的实现方式。 多态的底层实现 多态通过方法重写和方法重载来实现,方法重写是指子类重写父类的方法,而方法重载是指在同一个类中,两个或多个方法具有相同的名称,但具有不同的参数列表。 下面是一个多态的例子:…

    Java 2023年5月19日
    00
  • Java项目开发中实现分页的三种方式总结

    Java项目开发中实现分页的三种方式总结 在Java项目的开发过程中,经常需要对列表数据进行分页显示。本篇文章将总结Java项目开发中实现分页的三种方式,以供参考。 第一种方式:使用分页插件 分页插件是一种在MyBatis框架中常用的解决方案,它可以方便地实现分页功能。下面是使用MyBatis的一个示例: <!– 配置分页插件 –> <…

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