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

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

ภาพรวมของ PriorityBlockingQueue

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

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

ตัวอย่างนี้สาธิตเมธอด put(E e) ใน PriorityBlockingQueue

ขั้นตอนที่ 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) {
                // put() ใน unbounded queue ไม่เคย block
                priorityBlockingQueue.put("tutorialspoint.com");
                actionEvent.setText("" + priorityBlockingQueue);
            }
        });
    }
}

ข้อสังเกตสำคัญเกี่ยวกับ put() ใน PriorityBlockingQueue

✅ จุดสำคัญ: เนื่องจาก PriorityBlockingQueue เป็น unbounded เมธอด put() จะ ไม่เคย block ทำงานเหมือน add() หรือ offer() ทุกประการ

ลำดับความสำคัญ (Priority Order)

PriorityBlockingQueue เรียงตาม Natural Ordering (Comparable) หรือ Comparator ที่กำหนด:

  • String: เรียงตามตัวอักษร (A-Z, ก-ฮ)
  • ตัวเลข: เรียงจากน้อยไปมาก
  • Custom Object: ต้อง implements Comparable หรือส่ง Comparator

ตัวอย่างลำดับที่ได้

Input: "sai", "ram", "krishna", "prasad", "ram", "tutorialspoint.com"
Output (sorted): "krishna", "prasad", "ram", "ram", "sai", "tutorialspoint.com"

วิธีทดสอบ

  1. รันแอป ดูรายการเริ่มต้น (เรียงตาม priority แล้ว)
  2. คลิก TextView เพื่อเพิ่ม "tutorialspoint.com"
  3. สังเกตลำดับใหม่ - "tutorialspoint.com" จะอยู่ท้ายสุด (ขึ้นต้นด้วย t)

เมื่อไรควรใช้ put()?

แม้ใน PriorityBlockingQueue จะไม่ block แต่มักใช้ put() เพื่อความสอดคล้องกับ BlockingQueue interface หากในอนาคตเปลี่ยนเป็นคิวแบบ bounded (เช่น ArrayBlockingQueue) โค้ดก็ยังทำงานได้โดยไม่ต้องแก้ไข