ภาพรวมของ 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 ต่างๆ
| Queue | size() | Complexity | Bounded |
|---|---|---|---|
| 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
วิธีทดสอบ
- รันแอป ดูคิว (เรียง A-Z): [krishna, prasad, ram, ram, sai]
- คลิก TextView → แสดง "Size: 5"
- ลองเพิ่มข้อมูลแล้วเช็ค size() ใหม่
กรณีใช้งานจริง
- Monitoring queue size สำหรับ Metrics/Alerting
- Backpressure handling - ตัดสินใจ drop/reject เมื่อคิวใหญ่เกินไป
- Worker pool sizing - ปรับจำนวน Worker ตาม Queue size