java 如何实现一个队列存数据,一个队列读数据,要是有新数据,读数据的队列优先读取
时间: 2024-03-09 15:47:11 浏览: 141
可以使用Java中的阻塞队列来实现这个功能。具体地,可以使用两个阻塞队列,一个用于存放数据,一个用于读取数据。当有新数据时,先将数据存放在存放数据的队列中,然后唤醒读数据的线程。读数据的线程首先尝试从读数据的队列中读取数据,如果队列为空,则阻塞等待新数据的到来。当存放数据的队列中有新数据到来时,它会优先将数据放入读数据的队列中,这样读数据的线程就可以优先读取新数据了。以下是一个简单的示例代码:
```java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class QueueDemo {
private BlockingQueue<String> writeQueue = new LinkedBlockingQueue<>();
private BlockingQueue<String> readQueue = new LinkedBlockingQueue<>();
public void write(String data) throws InterruptedException {
writeQueue.put(data);
readQueue.put(data); // 优先将数据放入读数据的队列
}
public String read() throws InterruptedException {
return readQueue.take();
}
public static void main(String[] args) {
QueueDemo demo = new QueueDemo();
// 启动一个线程不断读取数据
new Thread(() -> {
while (true) {
try {
String data = demo.read();
System.out.println("Read data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 写入新数据
try {
Thread.sleep(1000); // 等待读数据的线程启动
demo.write("Data 1");
Thread.sleep(1000);
demo.write("Data 2");
Thread.sleep(1000);
demo.write("Data 3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
阅读全文