ภาพรวมของ 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() | โยน IllegalStateException | boolean |
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
วิธีทดสอบ
- รันแอป Deque จะเต็ม 3 รายการ
- คลิก TextView จะพยายาม putLast แต่จะ block (เพราะไม่มีที่ว่าง)
- ต้องมีเธรดอื่นเรียก takeFirst()/pollFirst() เพื่อทำที่ว่าง