Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

スレッドで実行するコードの指定

このガイドでは、Runnable.run() メソッドのコードを別のスレッドで実行する Runnable クラスの実装方法について説明します。Runnable を別のオブジェクトに渡し、そのオブジェクトがそれをスレッドにアタッチして実行するように指定することもできます。特定の操作を実行する 1 つ以上の Runnable オブジェクトは、タスクとも呼ばれます。

ThreadRunnable は基本的なクラスであり、それ自体では限られた機能しか持っていません。代わりに、HandlerThreadAsyncTaskIntentService などの強力な Android クラスの基礎になります。ThreadRunnableThreadPoolExecutor クラスの基礎になります。このクラスは、スレッドとタスクキューを自動的に管理します。複数のスレッドを並行して実行することもできます。

Runnable を実装するクラスを定義する

Runnable を実装するクラスの作成は簡単です。次に例を示します。

Kotlin

    class PhotoDecodeRunnable : Runnable {
        ...
        override fun run() {
            /*
             * Code you want to run on the thread goes here
             */
            ...
        }
        ...
    }

Java

    public class PhotoDecodeRunnable implements Runnable {
        ...
        @Override
        public void run() {
            /*
             * Code you want to run on the thread goes here
             */
            ...
        }
        ...
    }
    

run() メソッドを実装する

このクラスでは、実行されるコードは Runnable.run() メソッドに含まれています。通常、Runnable では何でも使用できます。ただし、Runnable は UI スレッドで実行されないため、View オブジェクトなどの UI オブジェクトを直接変更できないことに注意してください。UI スレッドと通信するには、UI スレッドと通信するレッスンで説明されている手法を使用する必要があります。

run() メソッドの冒頭で、Process.setThreadPriority()THREAD_PRIORITY_BACKGROUND を呼び出すことにより、スレッドがバックグラウンド優先度を使用するように設定します。この方法を使用すると、Runnable オブジェクトのスレッドと UI スレッドの間のリソース競合が減少します。

また、Thread.currentThread() を呼び出して、Runnable オブジェクトのThread への参照を、Runnable 自体に格納する必要があります。

次のスニペットは、run() メソッドを設定する方法を示しています。

Kotlin

    class PhotoDecodeRunnable : Runnable {
    ...
        /*
         * Defines the code to run for this task.
         */
        override fun run() {
            // Moves the current Thread into the background
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND)
            ...
            /*
             * Stores the current Thread in the PhotoTask instance,
             * so that the instance
             * can interrupt the Thread.
             */
            photoTask.setImageDecodeThread(Thread.currentThread())
            ...
        }
    ...
    }
    

Java

    class PhotoDecodeRunnable implements Runnable {
    ...
        /*
         * Defines the code to run for this task.
         */
        @Override
        public void run() {
            // Moves the current Thread into the background
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
            ...
            /*
             * Stores the current Thread in the PhotoTask instance,
             * so that the instance
             * can interrupt the Thread.
             */
            photoTask.setImageDecodeThread(Thread.currentThread());
            ...
        }
    ...
    }
    

詳細

Android でのマルチスレッド操作の詳細については、プロセスとスレッドの概要ガイドをご覧ください。

サンプルアプリ

このガイドのコンセプトを試すには、ThreadSample をダウンロードしてください。