AndroidのConcurrentLinkedDequeでsize()メソッドを使う方法を解説
ConcurrentLinkedDequeとは
例に入る前に、まずConcurrentLinkedDequeについて簡単に確認しておきましょう。ConcurrentLinkedDequeは、リンクノードベースのサイズ制限なし(アンバウンド)の両端キュー(Deque)です。複数のスレッドから同時に要素へアクセスしても、スレッドセーフが保証されるため、マルチスレッド環境でのデータ操作に適しています。
この記事では、AndroidアプリでConcurrentLinkedDequeのsize()メソッドを使用して、格納されている要素数を取得する方法を実例とともに解説します。
手順1:新規プロジェクトを作成する
Android Studioで新しいプロジェクトを作成します。メニューから「File」⇒「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。
手順2:レイアウトファイル(activity_main.xml)にコードを追加する
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>上記のコードでは、ConcurrentLinkedDequeの要素を表示するためのTextViewを配置しています。
手順3:MainActivity.javaにコードを追加する
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.ConcurrentLinkedDeque;
public class MainActivity extends AppCompatActivity {
ConcurrentLinkedDeque concurrentLinkedDeque;
String head;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
concurrentLinkedDeque = new ConcurrentLinkedDeque<String>();
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) {
actionEvent.setText("" + concurrentLinkedDeque.size());
}
});
}
}このコードでは、まずConcurrentLinkedDequeに「sai」「ram」「krishna」「prasad」の4つの文字列を追加し、TextViewにその内容を表示しています。そしてTextViewをタップすると、size()メソッドによって取得した要素数(この場合は「4」)が画面に表示される仕組みです。
アプリを実行して動作を確認する
それでは、アプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続していることを前提に説明します。Android Studioからアプリを起動するには、プロジェクト内のアクティビティファイルを開き、ツールバーのRunアイコンをクリックします。接続したモバイルデバイスを選択すると、スマートフォンにデフォルト画面が表示されます。

次に、画面上のTextViewをタップしてみてください。size()メソッドによる実行結果が、以下のように表示されます。

まとめ
ConcurrentLinkedDequeはスレッドセーフなコレクションクラスであり、size()メソッドを使うことで現在格納されている要素数を簡単に取得できます。ただし、並行処理向けの実装では、size()の呼び出し時に他スレッドからの変更が行われている可能性があるため、返される値は概算として扱う点に注意が必要です。マルチスレッド環境で安全にキューやスタックのような操作を行いたい場合に、ぜひ活用してみてください。
-
Android開発入門:LinkedBlockingDequeのsize()メソッドで要素数を取得する方法
LinkedBlockingDequeとは?実装例に入る前に、まずLinkedBlockingDequeについて簡単に確認しておきましょう。LinkedBlockingDequeは、CollectionインターフェースおよびAbstractQueueクラスに基づいて実装された両端キュー(Deque)です。連結ノード(linked nodes)を基盤としており、オプションで容量の上限(境界)を設定できます。コンストラクタにメモリサイズを渡すことで容量を制限でき、Androidアプリにおける無駄なメモリ消費を防ぐことにも役立ちます。本記事では、このLinkedBlockingDequeに対してsi
-
AndroidのCopyOnWriteArraySetでsize()メソッドを使用する方法
CopyOnWriteArraySetとは?サンプルを見ていく前に、まずCopyOnWriteArraySetについて簡単におさらいしておきましょう。CopyOnWriteArraySetは、java.util.concurrentパッケージに含まれるスレッドセーフなSet実装です。内部的にはCopyOnWriteArrayListを利用しており、addやremoveなどの変更操作が行われるたびに、基盤となる配列の新しいコピーを生成することで、複数スレッドからの安全なアクセスを実現しています。読み取りが多く書き込みが少ないケースに適しており、反復処理中にConcurrentModificati