java 两个CompletableFuture线程 线程a向队列放数据 同时先b从队列中取
时间: 2023-10-19 08:44:07 浏览: 170
感谢您的提问!在Java中,我们可以使用`CompletableFuture`来实现线程A向队列放数据,同时线程B从队列中取数据的操作。下面是一个示例代码:
```java
import java.util.concurrent.*;
public class CompletableFutureExample {
public static void main(String[] args) {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
CompletableFuture<Void> producer = CompletableFuture.runAsync(() -> {
try {
for (int i = 1; i <= 10; i++) {
queue.put(i);
System.out.println("Producer: Put " + i);
Thread.sleep(1000); // 模拟生产过程的延迟
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture<Void> consumer = CompletableFuture.runAsync(() -> {
try {
while (true) {
int value = queue.take();
System.out.println("Consumer: Took " + value);
Thread.sleep(2000); // 模拟消费过程的延迟
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture.allOf(producer, consumer).join();
}
}
```
在这个示例中,我们创建了一个 `LinkedBlockingQueue` 作为队列,线程A作为生产者向队列放入数据,线程B作为消费者从队列中取出数据。通过 `CompletableFuture.runAsync` 方法,我们将生产者和消费者任务分别封装成两个 `CompletableFuture` 对象。然后,我们可以使用 `CompletableFuture.allOf` 方法来等待两个任务完成。
当运行这个示例时,您会看到生产者线程会不断地往队列中放入数据,而消费者线程会从队列中取出数据进行处理。请注意,为了模拟生产和消费过程的延迟,我们在代码中使用了 `Thread.sleep` 方法。
阅读全文