📌  相关文章
📜  Java中的 LinkedBlockingDeque takeLast() 方法(1)

📅  最后修改于: 2023-12-03 15:16:23.881000             🧑  作者: Mango

Java中的 LinkedBlockingDeque takeLast() 方法

takeLast()方法是LinkedBlockingDeque类中的一个方法,它的作用是从队列中获取并移除最后一个元素。在调用这个方法时,如果队列为空,则会阻塞等待,直到队列中有了新的元素。如果线程被中断,则会抛出InterruptedException

语法
public E takeLast() throws InterruptedException
参数

无参数。

返回值

takeLast()方法返回从队列中获取的并移除的最后一个元素。

示例
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class TestTakeLast {
    public static void main(String[] args) throws InterruptedException {
        LinkedBlockingDeque<String> deque = new LinkedBlockingDeque<>();

        Thread thread = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
                deque.addLast("element 1");
                deque.addLast("element 2");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread.start();

        String ele1 = deque.takeLast(); // 阻塞等待直到队列中有元素
        System.out.println(ele1); // 输出:element 2
        String ele2 = deque.takeLast(); // 阻塞等待直到队列中有元素
        System.out.println(ele2); // 输出:element 1
    }
}
解释

在这个示例中,我们创建了一个LinkedBlockingDeque对象,并开启了一个后台线程,它会在2秒后向队列中添加两个元素。在主线程中,我们调用了takeLast()方法两次,分别获取并移除了队列中的“element 2”和“element 1”元素。由于后台线程在主线程调用takeLast()方法之前添加了元素,因此这两个调用都会立即返回。如果后台线程没有添加元素,则这两个调用都会一直阻塞等待,直到后台线程添加元素为止。

总结

takeLast()方法可以用来消费队列中的元素,如果队列为空则会阻塞等待,在多线程环境中可以用来实现生产者消费者模型。在使用takeLast()方法时,需要注意线程安全问题和异常处理。