Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách sử dụng poll() trong LinkedBlockingDeque trên Android

Giới thiệu về poll() trong LinkedBlockingDeque

poll() lấy và xóa phần tử đầu tiên (head) của deque. Trả về null nếu deque rỗng - không ném exception.

LinkedBlockingDeque hỗ trợ cả hai đầu: poll() (đầu) và pollLast() (cuối).

Ví dụ minh họa

Bước 1: Tạo project

Android Studio → File → New Project.

Bước 2: Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/actionEvent"
        android:textSize="40sp"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />
</LinearLayout>

Bước 3: Code (src/MainActivity.java)

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import java.util.concurrent.LinkedBlockingDeque;

public class MainActivity extends AppCompatActivity {
    LinkedBlockingDeque<String> linkedBlockingDeque;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        linkedBlockingDeque = new LinkedBlockingDeque<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);

        linkedBlockingDeque.add("sai");
        linkedBlockingDeque.add("ram");
        linkedBlockingDeque.add("krishna");
        linkedBlockingDeque.add("prasad");
        linkedBlockingDeque.add("ram");

        actionEvent.setText("" + linkedBlockingDeque);

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // poll() lấy và xóa phần tử ĐẦU
                String removed = linkedBlockingDeque.poll();
                actionEvent.setText("Đã lấy: " + removed + "\nCòn: " + linkedBlockingDeque);
            }
        });
    }
}

Kết quả

Ban đầu: [sai, ram, krishna, prasad, ram]

Click 1: Lấy "sai" → [ram, krishna, prasad, ram]

Click 2: Lấy "ram" → [krishna, prasad, ram]

Các phương thức poll trong Deque

Phương thức Vị trí Rỗng trả về Tương đương
poll() Đầu (head) null pollFirst()
pollFirst() Đầu null -
pollLast() Cuối (tail) null -

So sánh poll() vs remove() vs take()

Phương thức Rỗng Đầy (bounded) Blocking
poll() Trả về null - Không
remove() Ném Exception - Không
take() Block vô hạn - Có
poll(timeout) Chờ timeout - Có (timeout)

Ứng dụng thực tế - Double-ended Queue

LinkedBlockingDeque<Task> deque = new LinkedBlockingDeque<>();

// Thêm vào đầu (priority task)
deque.addFirst(urgentTask);

// Thêm vào cuối (normal task)
deque.addLast(normalTask);

// Lấy ưu tiên từ đầu
Task task = deque.poll(); // pollFirst()

// Hoặc lấy từ cuối (LIFO)
Task lastTask = deque.pollLast();

Lưu ý

  • poll() an toàn cho đa luồng
  • Trả về null thay vì crash - phù hợp cho consumer loop
  • Kết hợp với offer() cho non-blocking producer-consumer
  • Có thể dùng poll(timeout, TimeUnit) để chờ có phần tử