Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android PriorityBlockingQueue에서 peek() 메서드를 사용하는 방법

PriorityBlockingQueue란 무엇인가?

예제를 살펴보기 전에 PriorityBlockingQueue가 무엇인지 간단히 짚고 넘어가겠습니다. PriorityBlockingQueue는 무제한(unbounded) 큐로, 우선순위 큐(PriorityQueue)와 동일한 정렬 규칙을 따릅니다. 즉, 추가된 요소들이 우선순위에 따라 자동으로 정렬되며, 여러 스레드가 동시에 접근해도 안전하도록 스레드 안전성(thread-safety)이 보장됩니다. 또한 큐가 비어 있는 상태에서 요소를 꺼내려 하면 해당 스레드가 대기 상태가 되기 때문에, 생산자-소비자(Producer-Consumer) 패턴을 구현할 때 널리 활용됩니다.

이번 예제는 Android의 PriorityBlockingQueue에서 peek() 메서드를 사용하는 방법을 다룹니다. 참고로 peek()은 큐의 맨 앞(head)에 있는 요소를 큐에서 제거하지 않고 그대로 반환하는 메서드이며, 큐가 비어 있으면 null을 반환한다는 점을 기억해 두시기 바랍니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File ⇒ New Project로 이동하여 새 프로젝트를 생성하고, 프로젝트 생성에 필요한 모든 세부 정보를 입력합니다.

2단계 — 레이아웃 파일 작성

res/layout/activity_main.xml에 다음 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   xmlns:tools="https://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:gravity="center"
   android:layout_height="match_parent"
   tools:context=".MainActivity"
   android:orientation="vertical">
   <TextView
      android:id="@+id/actionEvent"
      android:textSize="40sp"
      android:layout_marginTop="30dp"
      android:layout_width="wrap_content"
      android:layout_height="match_parent" />
</LinearLayout>

위 코드에서는 PriorityBlockingQueue에 담긴 요소들을 화면에 표시하기 위해 TextView 하나를 배치했습니다.

3단계 — MainActivity 코드 작성

src/MainActivity.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 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("" + priorityBlockingQueue.peek());
         }
      });
   }
}

코드 흐름을 살펴보면, 먼저 PriorityBlockingQueue 객체를 생성한 뒤 문자열 요소 다섯 개를 add()로 추가합니다. 이때 큐 내부적으로는 사전순으로 정렬되어 저장됩니다. 초기에는 큐 전체 목록을 TextView에 출력하고, TextView를 클릭하면 peek()이 반환하는 맨 앞의 요소로 화면 내용을 변경하도록 클릭 리스너를 등록했습니다.

참고: 최신 Android Studio 프로젝트에서는 android.support 라이브러리 대신 androidx.appcompat.app.AppCompatActivity를 import해야 한다는 점에 유의하세요.

앱 실행 및 결과 확인

애플리케이션을 실행해 보겠습니다. 실제 Android 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 앱을 실행하려면 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 실행(Run) 아이콘을 클릭하고, 목록에서 본인의 모바일 기기를 선택합니다. 그러면 기기 화면에 아래와 같은 기본 화면이 나타납니다.

Android PriorityBlockingQueue에서 peek() 메서드를 사용하는 방법

이제 화면의 TextView를 클릭하면 peek()이 반환한 값, 즉 우선순위가 가장 높은(정렬상 맨 앞의) 요소가 아래와 같이 표시됩니다.

Android PriorityBlockingQueue에서 peek() 메서드를 사용하는 방법