在处理并发队列时,可以使用以下方法来限制队列的大小和时间范围:
ArrayBlockingQueue
或LinkedBlockingQueue
来创建一个固定大小的阻塞队列。当队列满时,生产者线程将被阻塞,直到队列中有空闲空间。import java.util.concurrent.ArrayBlockingQueue;
public class ConcurrentQueueExample {
private static final int QUEUE_SIZE = 10;
private static ArrayBlockingQueue queue = new ArrayBlockingQueue<>(QUEUE_SIZE);
public static void main(String[] args) {
// 生产者线程
Thread producerThread = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
queue.put(i); // 队列满时,生产者线程将被阻塞
System.out.println("Produced: " + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 消费者线程
Thread consumerThread = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
int value = queue.take(); // 队列空时,消费者线程将被阻塞
System.out.println("Consumed: " + value);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producerThread.start();
consumerThread.start();
}
}
ScheduledExecutorService
来创建一个定时任务,任务执行完后可以中断正在执行的线程。import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ConcurrentQueueExample {
private static final int QUEUE_SIZE = 10;
private static final long TIME_LIMIT = 10; // 10秒钟
private static BlockingQueue queue = new LinkedBlockingQueue<>(QUEUE_SIZE);
private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
// 生产者线程
Thread producerThread = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
queue.put(i);
System.out.println("Produced: " + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 消费者线程
Thread consumerThread = new Thread(() -> {
try {
for (int i = 0; i < 100; i++) {
int value = queue.take();
System.out.println("Consumed: " + value);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producerThread.start();
consumerThread.start();
// 创建一个定时任务,在时间范围内中断线程
scheduler.schedule(() -> {
producerThread.interrupt(); // 中断生产者线程
consumerThread.interrupt(); // 中断消费者线程
scheduler.shutdown();
}, TIME_LIMIT, TimeUnit.SECONDS);
}
}
这些示例代码演示了如何使用阻塞队列和计时器来限制并发队列的大小和时间范围。在实际应用中,可以根据具体需求进行调整和扩展。