两个CompletableFuture.supplyAsync同时执行向LinkedBlockingQueue放数据 while同时读取LinkedBlockingQueue的结果 但是代码卡住 不走while
时间: 2024-04-22 10:25:46 浏览: 143
你的代码可能卡住是因为在使用LinkedBlockingQueue时没有正确处理并发操作。以下是一个示例代码,演示了如何同时执行供应数据和消费数据的操作:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
CompletableFuture<Void> producerFuture = CompletableFuture.runAsync(() -> {
try {
for (int i = 1; i <= 10; i++) {
// 模拟生产数据
Thread.sleep(1000);
int data = i;
System.out.println("Producing: " + data);
queue.put(data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture<Void> consumerFuture = CompletableFuture.runAsync(() -> {
try {
while (true) {
// 模拟消费数据
Thread.sleep(2000);
int data = queue.take();
System.out.println("Consuming: " + data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture.allOf(producerFuture, consumerFuture).join();
}
}
```
在这个示例中,我们使用了两个CompletableFuture来同时执行生产和消费操作。生产者线程使用`put()`方法将数据放入LinkedBlockingQueue中,而消费者线程使用`take()`方法从队列中获取数据。注意,`put()`和`take()`方法都是阻塞的,确保在队列为空或已满时正确处理并发操作。
请注意,示例代码中使用了简单的睡眠来模拟生产和消费数据的过程,你可以根据实际需求进行修改。同时,确保在处理InterruptedException时,正确处理线程的中断情况。
阅读全文