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

วิธีใช้ putLast() ใน LinkedBlockingDeque ของ Android

ภาพรวมของ LinkedBlockingDeque

LinkedBlockingDeque เป็น Deque ที่รองรับขอบเขตตัวเลือก (optionally bounded) ใช้โหนดเชื่อมโยง สามารถกำหนดความจุผ่าน Constructor ช่วยจัดการหน่วยความจำได้ดี

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

ตัวอย่างนี้สาธิตเมธอด putLast(E e) ซึ่งเพิ่มสมาชิกที่ท้าย Deque บล็อก (block) จนกว่าจะมีพื้นที่ว่าง หาก Deque เต็ม

ขั้นตอนที่ 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.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);
        
        // สำคัญ: กำหนดขนาดเล็กเพื่อทดสอบการ block
        linkedBlockingDeque = new LinkedBlockingDeque<>(3);
        final TextView actionEvent = findViewById(R.id.actionEvent);
        
        linkedBlockingDeque.add("sai");
        linkedBlockingDeque.add("ram");
        linkedBlockingDeque.add("krishna");
        // Deque เต็มแล้ว (3/3)
        
        actionEvent.setText("" + linkedBlockingDeque);
        
        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // จะ block จนกว่าจะมีที่ว่าง (หรือถูก interrupt)
                    linkedBlockingDeque.putLast("tutorialspoint.com");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                actionEvent.setText("" + linkedBlockingDeque);
            }
        });
    }
}

ความแตกต่างระหว่าง add/put/offer

เมธอดพฤติกรรมเมื่อ Deque เต็มคืนค่า
addLast() / add()โยน IllegalStateExceptionboolean
offerLast()คืน false ทันทีboolean
putLast()บล็อก (รอ) จนกว่าจะมีที่ว่างvoid
offerLast(e, time, unit)รอตามเวลาที่กำหนดboolean

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

  • putLast() อาจทำให้ UI Thread ค้าง (ANR) หากเรียกบน Main Thread และ Deque เต็ม
  • ควรใช้ใน Worker Thread หรือใช้ offerLast() แทนสำหรับ UI Thread
  • ต้องใช้ try-catch จับ InterruptedException

วิธีทดสอบ

  1. รันแอป Deque จะเต็ม 3 รายการ
  2. คลิก TextView จะพยายาม putLast แต่จะ block (เพราะไม่มีที่ว่าง)
  3. ต้องมีเธรดอื่นเรียก takeFirst()/pollFirst() เพื่อทำที่ว่าง