java LinkedBlockingQueue 添加数据
时间: 2024-01-28 13:04:42 浏览: 27
可以使用Java中的LinkedBlockingQueue来添加数据。LinkedBlockingQueue是一个线程安全的队列,可以用于多线程环境下的数据传输和共享。下面是添加数据的示例代码:
```java
import java.util.concurrent.LinkedBlockingQueue;
public class Example {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(10); // 创建一个容量为10的队列
try {
queue.put("data1"); // 添加数据到队列中
queue.put("data2");
queue.put("data3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在上面的示例代码中,我们首先创建了一个容量为10的LinkedBlockingQueue队列。然后使用put()方法向队列中添加了三个数据。需要注意的是,put()方法会阻塞当前线程,直到队列中有空闲的位置可以添加数据。
相关问题
java多线程之线程安全队列LinkedBlockingQueue
LinkedBlockingQueue是Java多线程中的一个线程安全队列,它的底层实现是基于链表的,可以无限扩容,且支持阻塞式的读写操作。
LinkedBlockingQueue的使用非常广泛,比如在生产者-消费者模型中,生产者向队列中添加数据,消费者从队列中取出数据进行消费,因为LinkedBlockingQueue是线程安全的,所以可以保证数据的正确性。
LinkedBlockingQueue还有一个特点,就是可以设置队列的容量,如果在队列已满的情况下,继续向队列中添加数据,那么添加操作就会被阻塞,直到有其他线程从队列中取出数据,才能继续添加数据。
总的来说,LinkedBlockingQueue是一个非常实用的线程安全队列,可以帮助我们处理多线程并发访问的问题,提高程序的执行效率和安全性。
java中使用LinkedBlockingQueue和异步线程消费该队列
LinkedBlockingQueue是Java集合框架中的一种阻塞队列,它支持多线程并发操作,常用于生产者和消费者模式中。使用LinkedBlockingQueue可以保证生产者和消费者之间的数据传输是线程安全的。
异步线程消费该队列的具体实现方式如下:
1. 创建一个LinkedBlockingQueue对象,指定队列容量。
```java
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(100);
```
2. 创建一个生产者线程,向队列中不断添加数据。
```java
Thread producer = new Thread(() -> {
while (true) {
try {
String data = produceData();
queue.put(data);
System.out.println("Produced data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
producer.start();
```
3. 创建一个消费者线程池,使用异步线程消费队列中的数据。
```java
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < 2; i++) {
executorService.execute(() -> {
while (true) {
try {
String data = queue.take();
consumeData(data);
System.out.println("Consumed data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
```
在上述代码中,我们创建了一个固定大小为2的线程池,用于异步消费队列中的数据。每个线程都不断从队列中取出数据,并进行消费。由于LinkedBlockingQueue是阻塞队列,如果队列为空,消费线程将会阻塞等待,直到队列中有新的数据。
完整代码如下:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
public class LinkedBlockingQueueExample {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(100);
Thread producer = new Thread(() -> {
while (true) {
try {
String data = produceData();
queue.put(data);
System.out.println("Produced data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
producer.start();
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < 2; i++) {
executorService.execute(() -> {
while (true) {
try {
String data = queue.take();
consumeData(data);
System.out.println("Consumed data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
private static String produceData() {
return "data-" + System.currentTimeMillis();
}
private static void consumeData(String data) {
// do something with the data
}
}
```