当前位置:首页 > Java

java如何让线程等待

2026-03-03 14:24:13Java

线程等待的实现方法

在Java中,线程等待可以通过多种方式实现,以下是几种常见的方法:

使用 Object.wait() 方法

调用 wait() 方法使当前线程进入等待状态,直到其他线程调用 notify()notifyAll() 方法唤醒它。需要注意的是,wait() 必须在同步块或同步方法中调用。

synchronized (lockObject) {
    try {
        lockObject.wait(); // 线程进入等待状态
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

使用 Thread.sleep() 方法

sleep() 方法使当前线程暂停执行指定的时间,但不会释放锁。适用于需要延迟执行的场景。

java如何让线程等待

try {
    Thread.sleep(1000); // 线程休眠1秒
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

使用 CountDownLatch

CountDownLatch 是一个同步辅助类,允许一个或多个线程等待其他线程完成操作。

CountDownLatch latch = new CountDownLatch(1);

// 等待线程
new Thread(() -> {
    try {
        latch.await(); // 等待计数器归零
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

// 触发线程
new Thread(() -> {
    latch.countDown(); // 计数器减1
}).start();

使用 CyclicBarrier

java如何让线程等待

CyclicBarrier 允许一组线程互相等待,直到所有线程都到达某个屏障点。

CyclicBarrier barrier = new CyclicBarrier(2);

new Thread(() -> {
    try {
        barrier.await(); // 等待其他线程到达
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();

使用 Semaphore

Semaphore 用于控制同时访问特定资源的线程数量,通过 acquire()release() 方法实现线程等待和释放。

Semaphore semaphore = new Semaphore(0);

new Thread(() -> {
    try {
        semaphore.acquire(); // 等待许可
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

new Thread(() -> {
    semaphore.release(); // 释放许可
}).start();

注意事项

  • 使用 wait()notify() 时,必须确保在同步块中调用,以避免 IllegalMonitorStateException
  • sleep() 不会释放锁,而 wait() 会释放锁。
  • 高并发场景下,CountDownLatchCyclicBarrierwait()notify() 更易用且安全。
  • 避免在循环中直接调用 sleep()wait(),可能导致性能问题或死锁。

标签: 线程java
分享给朋友:

相关文章

java程序如何运行

java程序如何运行

编写Java代码 使用文本编辑器或IDE(如IntelliJ IDEA、Eclipse)编写Java源代码,保存为.java文件。例如: public class HelloWorld {…

java如何导入jar包

java如何导入jar包

在Eclipse中导入JAR包 右键项目 -> 选择"Properties" -> 左侧导航选择"Java Build Path" -> 切换到"Libraries"标签 ->…

java如何连接mysql数据库

java如何连接mysql数据库

连接 MySQL 数据库的步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,可以在 pom.xml 中添加以下依赖: <dependency…

如何精通java

如何精通java

理解Java核心概念 Java的基础知识包括数据类型、变量、运算符、控制流语句(如循环和条件判断)、数组以及面向对象编程(OOP)的核心概念(类、对象、继承、多态、封装)。熟练掌握这些内容是后续学习的…

如何系统的学习java

如何系统的学习java

学习Java的基础知识 Java的基础知识包括语法、数据类型、变量、运算符、控制流语句等。可以通过官方文档或入门书籍如《Java核心技术》来掌握这些内容。编写简单的程序练习基础语法,例如打印“Hell…

java实现vue接口

java实现vue接口

Java 实现 Vue 接口的方法 在 Java 中实现 Vue 前端调用的接口,通常需要使用 Spring Boot 框架构建 RESTful API。以下是具体的实现步骤和代码示例。 创建 Sp…