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

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

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

size() trả về số phần tử hiện có trong deque. Với LinkedBlockingDeque, phương thức này là O(1) và thread-safe (atomic) nhờ biến count được bảo vệ bởi lock.

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("Deque: " + linkedBlockingDeque + "\nSize: " + linkedBlockingDeque.size());

        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int size = linkedBlockingDeque.size();
                actionEvent.setText("Size: " + size + "\nDeque: " + linkedBlockingDeque);
            }
        });
    }
}

Kết quả

Ban đầu: Size: 5\nDeque: [sai, ram, krishna, prasad, ram]

Click: Hiển thị size = 5

Đặc điểm LinkedBlockingDeque

Đặc điểm Mô tả
Cấu trúc Doubly-linked list
Giới hạn Optional bounded (constructor capacity)
Thread-safe ReentrantLock (2 locks: head/tail)
size() O(1) - atomic (biến count)
Blocking ops putFirst, putLast, takeFirst, takeLast
Cho phép null Không

So sánh size() các Deque/Queue

Collection size() Atomic Lock
LinkedBlockingDeque O(1) Có ReentrantLock
ConcurrentLinkedDeque O(n) Không Lock-free
ArrayDeque (not thread-safe) O(1) N/A Không
LinkedBlockingQueue O(1) Có ReentrantLock

Ứng dụng thực tế - Bounded Buffer Monitoring

// Bounded deque - giới hạn 100 phần tử
LinkedBlockingDeque<Event> eventBuffer = new LinkedBlockingDeque<>(100);

// Producer
eventBuffer.putLast(new Event("click")); // Block nếu đầy

// Monitoring
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(() -> {
    int size = eventBuffer.size(); // O(1) - nhanh
    int remaining = eventBuffer.remainingCapacity(); // 100 - size
    double usage = (double) size / 100 * 100;
    
    if (usage > 80) {
        alert("Buffer near capacity: " + usage + "%");
    }
}, 0, 10, TimeUnit.SECONDS);

Lưu ý

  • size() O(1) nhờ biến count (khác ConcurrentLinkedDeque O(n))
  • remainingCapacity() = capacity - size() (chỉ có nghĩa khi bounded)
  • Unbounded deque: remainingCapacity() = Integer.MAX_VALUE
  • Thread-safe cho multiple producers/consumers