Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีใช้ size() ใน PriorityBlockingQueue ของ Android

ภาพรวมของ PriorityBlockingQueue

PriorityBlockingQueue เป็นคิวแบบไม่มีขอบเขต (unbounded) เรียงลำดับตามความสำคัญ (priority order) ใช้จัดการปัญหา OutOfMemoryError

ตัวอย่างการใช้งาน size()

ตัวอย่างนี้สาธิตเมธอด size() ซึ่งคืนจำนวนสมาชิกในคิว เป็น O(1) เร็วกว่า ConcurrentLinkedQueue

ขั้นตอนที่ 1-2: สร้างโปรเจกต์และ Layout

สร้างโปรเจกต์ใหม่ ใช้ Layout TextView

ขั้นตอนที่ 3: โค้ด 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.PriorityBlockingQueue;

public class MainActivity extends AppCompatActivity {
    PriorityBlockingQueue<String> priorityBlockingQueue;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        priorityBlockingQueue = new PriorityBlockingQueue<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);
        
        priorityBlockingQueue.add("sai");
        priorityBlockingQueue.add("ram");
        priorityBlockingQueue.add("krishna");
        priorityBlockingQueue.add("prasad");
        priorityBlockingQueue.add("ram");
        
        actionEvent.setText("" + priorityBlockingQueue);
        
        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                actionEvent.setText("Size: " + priorityBlockingQueue.size());
            }
        });
    }
}

size() ใน PriorityBlockingQueue

  • คืนจำนวนสมาชิกในคิว
  • เป็น O(1) - มี Atomic Counter ภายใน (ต่างจาก ConcurrentLinkedQueue)
  • Thread-safe - ใช้ Lock (ReentrantLock) ภายใน
  • รวมสมาชิกที่รออยู่ใน take()/put() ด้วย

ตัวอย่างข้อมูล (Priority Order = Alphabetical)

เพิ่ม: "sai", "ram", "krishna", "prasad", "ram"
Queue 內部 (Priority Order): [krishna, prasad, ram, ram, sai]
size() = 5

เปรียบเทียบ size() ใน BlockingQueue ต่างๆ

Queuesize()ComplexityBounded
PriorityBlockingQueue✅ รองรับO(1)ไม่ (Unbounded)
LinkedBlockingQueue✅ รองรับO(1)Optional
ArrayBlockingQueue✅ รองรับO(1)ใช่ (Fixed)
ConcurrentLinkedQueue✅ รองรับO(n)ไม่ (Unbounded)
DelayQueue✅ รองรับO(1)ไม่

เมธอดที่เกี่ยวข้องกับขนาด

// จำนวนสมาชิกปัจจุบัน - O(1)
int size()

// เช็คว่าง - O(1)
boolean isEmpty()

// ความจุที่เหลือ - PriorityBlockingQueue เป็น Unbounded
// เสมอคืน Integer.MAX_VALUE
int remainingCapacity()

⚠️ ข้อควรระวัง

  • PriorityBlockingQueue เป็น Unbounded → remainingCapacity() คืน Integer.MAX_VALUE เสมอ
  • Iterator ไม่รับประกันลำดับ Priority (แต่ size() ถูกต้อง)
  • การใช้ Lock ทำให้ช้ากว่า ConcurrentLinkedQueue ภายใต้ Low contention

วิธีทดสอบ

  1. รันแอป ดูคิว (เรียง A-Z): [krishna, prasad, ram, ram, sai]
  2. คลิก TextView → แสดง "Size: 5"
  3. ลองเพิ่มข้อมูลแล้วเช็ค size() ใหม่

กรณีใช้งานจริง

  • Monitoring queue size สำหรับ Metrics/Alerting
  • Backpressure handling - ตัดสินใจ drop/reject เมื่อคิวใหญ่เกินไป
  • Worker pool sizing - ปรับจำนวน Worker ตาม Queue size