📌  相关文章
📜  Java中的 BlockingDeque removeFirstOccurrence() 方法及示例(1)

📅  最后修改于: 2023-12-03 14:42:44.695000             🧑  作者: Mango

Java中的 BlockingDeque removeFirstOccurrence() 方法及示例

简介

BlockingDeque是Java集合框架中提供的一种具有阻塞特性的双向队列接口。它继承自Deque接口,并在其基础上增加了阻塞功能。

removeFirstOccurrence()方法是BlockingDeque接口中的一个用于删除指定元素的方法,该方法会从队列的头开始查找,删除第一个与指定元素相等的元素。如果该元素不存在,则返回false。

方法签名
boolean removeFirstOccurrence(Object o)

参数说明:

  • o:待删除的元素

返回值类型:boolean

  • 如果队列中存在指定元素,则返回true,否则返回false。
示例

下面是一个简单的示例,使用BlockingDeque实现了一个基于任务队列的多线程生产者-消费者模型。

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class BlockingDequeExample {

    static class Task {
        private final String name;
        private final int duration;

        public Task(String name, int duration) {
            this.name = name;
            this.duration = duration;
        }

        public String getName() {
            return name;
        }

        public int getDuration() {
            return duration;
        }
    }

    static class Producer implements Runnable {
        private final BlockingDeque<Task> taskQueue;
        private int taskId;

        public Producer(BlockingDeque<Task> taskQueue) {
            this.taskQueue = taskQueue;
        }

        @Override
        public void run() {
            while (!Thread.interrupted()) {
                try {
                    Task task = new Task("Task-" + (++taskId), taskId % 1000);
                    taskQueue.putLast(task);
                    System.out.println("Produced " + task.getName());
                    TimeUnit.MILLISECONDS.sleep(10);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    }

    static class Consumer implements Runnable {
        private final BlockingDeque<Task> taskQueue;

        public Consumer(BlockingDeque<Task> taskQueue) {
            this.taskQueue = taskQueue;
        }

        @Override
        public void run() {
            while (!Thread.interrupted()) {
                try {
                    Task task = taskQueue.takeFirst();
                    System.out.println("Consumed " + task.getName());
                    TimeUnit.MILLISECONDS.sleep(task.getDuration());
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        BlockingDeque<Task> taskQueue = new LinkedBlockingDeque<>();
        Producer producer = new Producer(taskQueue);
        Consumer consumer = new Consumer(taskQueue);
        Thread producerThread = new Thread(producer);
        Thread consumerThread = new Thread(consumer);
        producerThread.start();
        consumerThread.start();
        TimeUnit.SECONDS.sleep(5);
        producerThread.interrupt();
        consumerThread.interrupt();
    }
}

上述示例中,Producer为生产者线程,每隔一段时间就向任务队列中添加一个随机生成的Task对象;Consumer为消费者线程,它从任务队列中取出任务并执行。其中,在消费完一个任务后,使用removeFirstOccurrence()方法从任务队列中删除该任务。

结论

removeFirstOccurrence()方法是BlockingDeque接口中的一个用于删除指定元素的方法,在多线程生产者-消费者模型中可以用于删除消费者线程已经执行完的任务。