当前位置:首页 > Java

java如何阻塞线程

2026-03-25 03:26:27Java

阻塞线程的方法

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

使用 Thread.sleep() Thread.sleep(long millis) 方法使当前线程暂停执行指定的毫秒数。线程进入 TIMED_WAITING 状态,不会释放锁。

try {
    Thread.sleep(1000); // 阻塞1秒
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

使用 Object.wait() wait() 方法使线程进入等待状态,直到其他线程调用 notify()notifyAll()。调用前必须持有对象的监视器锁(即在 synchronized 块中)。

synchronized (lockObject) {
    try {
        lockObject.wait(); // 释放锁并阻塞
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}

使用 LockCondition java.util.concurrent.locks.Lock 接口的 Condition 提供了更灵活的阻塞机制,类似于 wait()/notify(),但支持多个条件队列。

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

lock.lock();
try {
    condition.await(); // 释放锁并阻塞
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
} finally {
    lock.unlock();
}

使用阻塞队列 BlockingQueue(如 ArrayBlockingQueue)的 take()put() 方法会在队列空或满时自动阻塞线程。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
try {
    String item = queue.take(); // 队列空时阻塞
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

使用 CountDownLatch CountDownLatch 允许线程等待直到计数器归零。

java如何阻塞线程

CountDownLatch latch = new CountDownLatch(1);
try {
    latch.await(); // 阻塞直到countDown()被调用
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

注意事项

  • 阻塞方法(如 sleep()wait()await())通常会抛出 InterruptedException,需妥善处理中断信号。
  • 使用 wait()Condition 时,必须确保在阻塞前持有正确的锁。
  • 根据场景选择合适工具:简单延迟用 sleep(),线程协作用 wait()/Condition,任务协调用 CountDownLatchCyclicBarrier

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

相关文章

java如何创建线程

java如何创建线程

创建线程的方法 在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。以下是具体实现方法: 继承Thread类 通过继承Thread类并重写run()方法可以创建线程。…

java如何react

java如何react

在Java中使用React 要在Java项目中集成React,通常需要将React前端与Java后端结合使用。以下是几种常见的方法: 使用Spring Boot作为后端 Spring Boot是一个…

java如何创建类

java如何创建类

创建类的基本语法 在Java中,类通过class关键字定义,语法如下: [访问修饰符] class 类名 { // 成员变量(属性) // 构造方法 // 成员方法 }…

java如何创建对象

java如何创建对象

创建对象的基本方法 在Java中,创建对象主要通过new关键字调用构造函数完成。基本语法为: ClassName objectName = new ClassName(); 例如创建String对象…

java如何导包

java如何导包

导入包的方法 在Java中,导入包(package)可以通过import语句实现,用于引入其他类或包中的功能。以下是几种常见的导包方式: 导入单个类 import java.util.ArrayL…

java如何运行程序

java如何运行程序

运行Java程序的步骤 安装Java开发工具包(JDK) 确保系统已安装JDK,可通过命令行输入java -version和javac -version验证。若未安装,需从Oracle官网下载并配置环…