亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java LinkedBlockingQueue

Java LinkedBlockingQueue

在本教程中,我们将通过示例了解 LinkedBLockingQueue 类及其方法。

LinkedBlockingQueue Java Collections 的类 框架使用链表提供阻塞队列实现。

它实现了Java BlockingQueue接口。


创建 LinkedBlockingQueue

为了创建一个链接阻塞队列,我们​​必须导入 java.util.concurrent.LinkedBlockingQueue 包。

以下是我们如何在 Java 中创建链接阻塞队列:

1。没有初始容量

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

这里默认的初始容量为 2 31 -1.

2。具有初始容量

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);

在这里,

例如,

// Creating String type LinkedBlockingQueue with size 5
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

// Creating Integer type LinkedBlockingQueue with size 5
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>(5);

注意: 不强制提供链表的大小。


LinkedBlockingQueue的方法

LinkedBlockingQueue 类提供了BlockingQueue接口中所有方法的实现。

这些方法用于在链接的阻塞队列中插入、访问和删除元素。

另外,我们将学习两种方法put()take() 支持链接阻塞队列中的阻塞操作。

这两种方法将链接阻塞队列与其他典型队列区分开来。


插入元素

例如,

import java.util.concurrent.LinkedBlockingQueue;

class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

        // Using add()
        animals.add("Dog");
        animals.add("Cat");

        // Using offer()
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]

访问元素

例如,

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

        // Add elements
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);

        // Using peek()
        String element = animals.peek();
        System.out.println("Accessed Element: " + element);

        // Using iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("LinkedBlockingQueue Elements: ");

        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]
Accessed Element: Dog
LinkedBlockingQueue Elements: Dog, Cat, Horse,

删除元素

例如,

import java.util.concurrent.LinkedBlockingQueue;

class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue " + animals);

        // Using remove()
        String element1 = animals.remove();
        System.out.println("Removed Element:");
        System.out.println("Using remove(): " + element1);

        // Using poll()
        String element2 = animals.poll();
        System.out.println("Using poll(): " + element2);

        // Using clear()
        animals.clear();
        System.out.println("Updated LinkedBlockingQueue " + animals);
    }
}

输出

LinkedBlockingQueue: [Dog, Cat, Horse]
Removed Elements:
Using remove(): Dog
Using poll(): Cat
Updated LinkedBlockingQueue: []

put() 和 take() 方法

在多线程进程中,我们可以使用 put()take() 阻止一个线程的操作以使其与另一个线程同步。这些方法会一直等到可以成功执行。


put() 方法

要将指定元素插入到链接阻塞队列的末尾,我们使用 put() 方法。

如果链接阻塞队列已满,则等待链接阻塞队列中有空间插入元素。

例如,

import java.util.concurrent.LinkedBlockingQueue;

class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

       try {
        // Add elements to animals
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat]

这里,put() 方法可能会抛出 InterruptedException 如果在等待时被中断。因此,我们必须将它包含在 try..catch 块中。


take() 方法

要从链接阻塞队列的前面返回和删除一个元素,我们可以使用 take() 方法。

如果链接阻塞队列为空,则等待链接阻塞队列中有元素被删除。

例如,

import java.util.concurrent.LinkedBlockingQueue;

class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);

       try {
           //Add elements to animals
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("LinkedBlockingQueue: " + animals);

           // Remove an element
           String element = animals.take();
           System.out.println("Removed Element: " + element);
           System.out.println("New LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

输出

LinkedBlockingQueue: [Dog, Cat]
Removed Element: Dog
New LinkedBlockingQueue: [Cat]

这里,take() 方法将抛出 InterrupedException 如果在等待时被中断。因此,我们必须将它包含在 try...catch 中 块。


其他方法

方法 说明
contains(element) 在链接的阻塞队列中搜索指定元素。如果找到该元素,则返回 true ,如果不是,则返回 false .
size() 返回链接阻塞队列的长度。
toArray() 将链接阻塞队列转换为数组并返回数组。
toString() 将链接的阻塞队列转换为字符串

为什么要使用 LinkedBlockingQueue?

LinkedBlockingQueue 使用链表作为其内部存储。

它被认为是线程安全的 收藏。因此,它通常用于多线程应用程序中。

假设,一个线程正在向队列中插入元素,而另一个线程正在从队列中移除元素。

现在,如果第一个线程比第二个线程慢,那么链接阻塞队列可以让第二个线程等待,直到第一个线程完成它的操作。


java

  1. Java 运算符
  2. Java 评论
  3. Java if...else 语句
  4. Java for-each 循环
  5. Java break 语句
  6. Java 字符串
  7. Java 接口
  8. Java 匿名类
  9. Java try-with-resources
  10. Java 注释
  11. Java 断言
  12. Java 向量