当前位置:首页 > Java

java如何阻塞

2026-03-20 12:38:18Java

阻塞的概念

阻塞是指线程在执行过程中被暂停,直到某个条件满足才能继续执行。在Java中,阻塞通常用于多线程编程,以协调线程间的执行顺序或资源共享。

使用Object.wait()和notify()

通过Object类的wait()和notify()方法可以实现线程阻塞和唤醒。wait()使当前线程进入等待状态,直到其他线程调用notify()或notifyAll()。

synchronized (lockObject) {
    while (!condition) {
        lockObject.wait();
    }
    // 条件满足后继续执行
}

使用Lock和Condition

Java并发包中的Lock和Condition提供了更灵活的阻塞机制。Condition的await()方法类似于wait(),signal()类似于notify()。

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

lock.lock();
try {
    while (!conditionMet) {
        condition.await();
    }
} finally {
    lock.unlock();
}

使用BlockingQueue

BlockingQueue是一种线程安全的队列,当队列为空时,take()方法会阻塞;当队列满时,put()方法会阻塞。

java如何阻塞

BlockingQueue<String> queue = new LinkedBlockingQueue<>();
queue.put("item"); // 可能阻塞
String item = queue.take(); // 可能阻塞

使用CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。通过await()方法阻塞,直到计数器归零。

CountDownLatch latch = new CountDownLatch(1);

new Thread(() -> {
    // 执行任务
    latch.countDown();
}).start();

latch.await(); // 阻塞直到计数器归零

使用CyclicBarrier

CyclicBarrier让一组线程互相等待,到达屏障点时阻塞,直到所有线程都到达。

CyclicBarrier barrier = new CyclicBarrier(2);

new Thread(() -> {
    barrier.await(); // 阻塞
}).start();

barrier.await(); // 阻塞

使用Semaphore

Semaphore通过许可机制控制资源访问。acquire()方法会阻塞,直到获得许可。

java如何阻塞

Semaphore semaphore = new Semaphore(1);

semaphore.acquire(); // 阻塞直到获得许可
try {
    // 临界区
} finally {
    semaphore.release();
}

使用Thread.join()

Thread.join()方法使当前线程等待目标线程执行完毕。

Thread thread = new Thread(() -> {
    // 执行任务
});
thread.start();
thread.join(); // 阻塞直到thread结束

使用Future.get()

Future.get()方法会阻塞,直到异步任务完成并返回结果。

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> "result");
String result = future.get(); // 阻塞直到任务完成

使用SynchronousQueue

SynchronousQueue是一种特殊的阻塞队列,每个插入操作必须等待对应的移除操作。

SynchronousQueue<String> queue = new SynchronousQueue<>();
new Thread(() -> {
    queue.take(); // 阻塞
}).start();
queue.put("item"); // 阻塞直到有消费者

注意事项

  • 避免死锁,确保阻塞和唤醒的逻辑正确。
  • 使用中断机制(InterruptedException)处理阻塞线程的取消。
  • 根据场景选择合适的阻塞工具,例如生产者-消费者模型适合BlockingQueue。

标签: java
分享给朋友:

相关文章

如何学习java

如何学习java

学习Java的步骤 理解基础知识 从Java的基本语法开始,包括变量、数据类型、运算符、控制流(if-else、循环)等。掌握这些基础概念是后续学习的基石。 学习面向对象编程(OOP) Java是一…

java如何编写接口

java如何编写接口

编写Java接口的基本语法 在Java中,接口通过interface关键字定义,可以包含抽象方法、默认方法、静态方法和常量。 public interface MyInterface {…

react如何与java配合

react如何与java配合

React 与 Java 配合的常见方式 React 作为前端框架,通常与 Java 后端通过 RESTful API 或 GraphQL 进行交互。以下是几种常见的配合方式: RESTful AP…

php 实现 java md5

php 实现 java md5

在 PHP 中实现与 Java 相同的 MD5 哈希算法,关键在于确保编码和输出格式的一致性。以下是具体实现方法和注意事项: 确保字符串编码一致 Java 的 String.getBytes() 默…

java 实现 php ord

java 实现 php ord

Java 实现 PHP 的 ord 函数 PHP 的 ord 函数用于获取字符串中第一个字符的 ASCII 值。在 Java 中,可以通过类型转换或直接使用字符的 Unicode 值实现类似功能。…

java实现php

java实现php

Java 实现 PHP 功能的方法 在 Java 中实现 PHP 的功能通常涉及以下几个方面:字符串处理、Web 开发、数据库操作等。以下是几种常见需求的实现方法。 字符串处理 PHP 中的字符串处…