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

วิธีใช้ removeLast() ใน ConcurrentLinkedDeque ของ Android

ภาพรวมของ ConcurrentLinkedDeque

ConcurrentLinkedDeque เป็น Deque แบบไม่มีขอบเขต (unbounded) บนโหนดเชื่อมโยง รองรับหลายเธรด (thread-safe) อย่างปลอดภัย

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

ตัวอย่างนี้สาธิตเมธอด removeLast() ซึ่งนำสมาชิกที่ ท้าย (tail/last) ออกและคืนค่า โยน NoSuchElementException หาก 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.ConcurrentLinkedDeque;

public class MainActivity extends AppCompatActivity {
    ConcurrentLinkedDeque<String> concurrentLinkedDeque;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        concurrentLinkedDeque = new ConcurrentLinkedDeque<>();
        final TextView actionEvent = findViewById(R.id.actionEvent);
        
        concurrentLinkedDeque.add("sai");
        concurrentLinkedDeque.add("ram");
        concurrentLinkedDeque.add("krishna");
        concurrentLinkedDeque.add("prasad");
        
        actionEvent.setText("" + concurrentLinkedDeque);
        
        actionEvent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                concurrentLinkedDeque.removeLast();  // นำออกที่ท้าย โยน Exception ถ้าว่าง
                actionEvent.setText("" + concurrentLinkedDeque);
            }
        });
    }
}

removeLast() ใน ConcurrentLinkedDeque

  • นำสมาชิกท้ายออกและคืนค่า
  • โยน NoSuchElementException หาก Deque ว่าง
  • Thread-safe - Non-blocking algorithm (CAS)
  • ไม่ Block (ต่างจาก LinkedBlockingDeque.takeLast())

เปรียบเทียบเมธอดนำออกที่ท้าย

เมธอดคืนค่าDeque ว่างBlocking
removeLast()ENoSuchElementExceptionไม่
pollLast()Enullไม่
takeLast()EBlock จนกว่าจะมีข้อมูลใช่ (BlockingDeque)

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

❌ ไม่ควรใช้ removeLast() บน UI Thread โดยไม่ตรวจสอบ
อาจทำให้แอป Crash หาก Deque ว่าง ควรใช้ pollLast() แทน

แนวทางปลอดภัย

// แบบที่ 1: ใช้ pollLast() (แนะนำ)
String removed = concurrentLinkedDeque.pollLast();
if (removed != null) {
    actionEvent.setText("Removed: " + removed + " | " + concurrentLinkedDeque);
} else {
    actionEvent.setText("Deque is empty!");
}

// แบบที่ 2: ตรวจสอบก่อนลบ
if (!concurrentLinkedDeque.isEmpty()) {
    String removed = concurrentLinkedDeque.removeLast();
    actionEvent.setText("Removed: " + removed + " | " + concurrentLinkedDeque);
}

// แบบที่ 3: try-catch
try {
    String removed = concurrentLinkedDeque.removeLast();
    actionEvent.setText("Removed: " + removed + " | " + concurrentLinkedDeque);
} catch (NoSuchElementException e) {
    actionEvent.setText("Deque is empty!");
}

วิธีทดสอบ

  1. รันแอป ดู Deque: [sai, ram, krishna, prasad]
  2. คลิก TextView → นำ "prasad" ออก เหลือ [sai, ram, krishna]
  3. คลิกซ้ำจน Deque ว่าง
  4. คลิกอีกครั้ง → Crash (NoSuchElementException)
  5. ลองแก้โค้ดใช้ pollLast() จะไม่ Crash

LinkedBlockingDeque vs ConcurrentLinkedDeque - removeLast()

คุณสมบัติLinkedBlockingDequeConcurrentLinkedDeque
Blocking operationsมี (takeLast, putLast)ไม่มี
BoundedOptionalUnbounded
AlgorithmLock-based (ReentrantLock)Lock-free (CAS)
Performance (High contention)ช้ากว่าเร็วกว่า