PR

【Java】Runnableとは?Threadとの違いとrunメソッドを初心者向けに解説

unDrawのCoding Assistantイラストを使いRunnableで処理を渡すことを表すアイキャッチ画像 Java

Runnableは、あとで実行してほしい処理を表すインターフェースです。

ThreadやExecutorに処理を渡すとき、Javaでは『何を実行するか』をRunnableとして表すことがあります。戻り値はなく、中心になるメソッドはrun()です。

Runnableは『実行する作業メモ』、Threadは『実行する流れ』と分けて覚えると、混乱しにくくなります。

この記事では、Runnableの意味、runメソッド、Threadとの違い、ラムダ式で書ける理由を初心者向けに整理します。

スポンサーリンク

まず結論:Runnableは処理そのものを表す

Runnableは、戻り値のない処理を表す関数型インターフェースです。Java公式APIでも、結果を返さない操作を表すものとして説明されています。

次の図で、Runnableを『処理カード』としてThreadへ渡すイメージを確認してください。

Runnableを実行したい処理カードとしてThreadへ渡すイメージ
Runnableは、Threadなどへ渡せる実行内容を表します。

Runnable単体は、新しいスレッドを作るものではありません。あくまで『実行してほしい処理』を表します。実際に別の実行の流れで動かすには、Threadなどに渡します。

runメソッドの基本

Runnableで必ず出てくるのがrun()メソッドです。Runnableを自分で書く場合、この中に実行したい処理を書きます。

Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("task start");
    }
};

task.run();

このコードでは、Runnableを作ってrun()を呼び出しています。ただし、この呼び出しは普通のメソッド呼び出しです。新しいThreadで動いているわけではありません。

次の図では、処理を定義してから実行されるまでの流れを確認してください。

Runnableのrunメソッドに処理を書いて実行する流れ
runメソッドには、あとで実行したい処理を書きます。

Runnableは、処理の中身をまとめて名前を付けられる形です。メソッドを呼ぶ側と、処理の中身を作る側を分けたいときに役立ちます。

Threadとの違い

RunnableとThreadの違いは、初心者が最も混乱しやすいポイントです。Runnableは作業内容、Threadは実行の流れだと分けて考えます。

比較RunnableThread
役割実行する処理を表す処理を実行する流れを表す
中心メソッドrun()start()join()など
単体で並行実行する?しないstart()で開始する
覚え方作業カード作業者のレーン

Threadの基本はJava Threadの記事で扱います。ここでは、RunnableはThreadへ渡せる処理の形だと押さえてください。

startとrunを混同しない

ThreadにRunnableを渡した場合、start()を呼ぶと新しい実行の流れでrun()が実行されます。一方、run()を直接呼ぶと普通のメソッド呼び出しです。

Runnable task = () -> System.out.println("task");

Thread thread = new Thread(task);
thread.start(); // 新しい実行の流れでrunが呼ばれる

task.run();     // 普通のメソッド呼び出し

次の比較図で、start()run()の違いを整理してください。

ThreadのstartとRunnableのrunの違いを比較する図
startはThreadの開始、runは処理本体のメソッドとして読み分けます。

Runnableを理解すると、Threadのコードを読んだときに『処理の中身』と『実行の始まり』を分けて追えるようになります。

ラムダ式で書ける理由

Runnableは抽象メソッドがrun()だけの関数型インターフェースです。そのため、Javaのラムダ式で短く書けます。

Runnable task = () -> {
    System.out.println("hello");
};

new Thread(task).start();

ラムダ式そのものはJavaのラムダ式で、関数型インターフェースの考え方は関数型インターフェースの記事で詳しく扱っています。Runnableは、その代表的な例として読むと理解しやすいです。

次の図では、匿名クラスからラムダ式へ書き方が短くなる流れを確認してください。

匿名クラスで書いたRunnableがラムダ式で短くなるイメージ
Runnableはrunだけを持つため、ラムダ式で実行内容を短く渡せます。

短く書けること自体よりも、『runに入れる処理を渡している』と読めることが大切です。

Runnableを使う場面

  • Threadに実行する処理を渡したい
  • 戻り値が不要な処理をひとまとまりにしたい
  • ラムダ式で短く処理を渡したい
  • 処理の内容と実行方法を分けて設計したい

戻り値が必要な並行処理ではCallableなど別の選択肢もあります。初心者の段階では、まずRunnableを『戻り値なしの処理を渡す形』として理解しましょう。

実務コードで読むときのコツ

実務コードでRunnableが出てきたら、最初に見るべきなのは『何を担当しているのか』です。名前だけを暗記するより、値を順番に取り出すのか、処理を渡すのか、別の実行の流れを作るのかを日本語に直す方が理解しやすくなります。

次に、型、呼び出しているメソッド、戻り値の3つを順番に確認します。型を見ると役割の範囲が分かり、メソッドを見るとその行で何をしたいのかが分かり、戻り値を見ると次の処理へどうつながるかが分かります。

この記事の範囲では、細かい内部実装をすべて覚えることよりも、初見のコードで立ち止まらないことを優先しています。必要になったら公式APIを確認しながら、まずは代表的な書き方を読める状態を作りましょう。

チーム開発では、同じ目的を複数の書き方で実現できることがあります。そのため『この書き方だけが正解』と覚えるのではなく、なぜその場面でそのクラスやインターフェースが選ばれているのかを考えるのが大切です。

サンプルコードと実務コードでは情報量が違います。実務コードでは、変数名、メソッド名、例外処理、戻り値の受け渡しが同時に出てきます。読み始めで混乱したら、まずこのページで扱った最小コードまで戻し、1行ずつ役割を書き出すと整理できます。

判断に迷ったときの基準

Runnableを使うべきか迷ったときは、先に目的を言葉にしてみます。目的が曖昧なままコードを書き始めると、似たクラスや似た構文との違いが見えなくなります。

確認すること見るポイント
扱いたい対象値、一覧、処理、実行の流れなど何を扱うのか
必要な操作取り出す、渡す、開始する、待つ、変換するなど何をしたいのか
既存記事との関係基礎文法、コレクション、インターフェース、ラムダ式のどれにつながるか
注意点順番、戻り値、例外、状態変更、実行タイミングなど見落としやすい点

この4点を先に確認すると、単なる暗記ではなく、コードを読むための判断軸ができます。初心者向けの記事でも、この判断軸まで持てると次の応用記事へ進みやすくなります。

練習問題

理解を確認するために、次の観点でサンプルコードを自分で説明してみてください。実行できる環境がある場合は、少し値を変えて結果がどう変わるかも試すと定着しやすくなります。

  • Runnableは何を扱うために使われているか説明する
  • コードの中で一番重要なメソッドを1つ選び、役割を説明する
  • 既存記事で学んだ概念とどこがつながるか説明する
  • 初心者が間違えやすいポイントを1つ挙げ、回避方法を書く

練習では、正確な用語を最初から完璧に使う必要はありません。まずは『何を受け取り、何を実行し、どのタイミングで次へ進むのか』を自分の言葉で言えることを目標にしてください。

よくある疑問

最初から細かい仕様まで覚えるべき?

最初からすべてのメソッドや内部仕様を暗記する必要はありません。初心者の段階では、代表的な使い方、よくあるつまずき、既存記事とのつながりを押さえれば十分です。必要になったタイミングで公式APIを確認する習慣を作りましょう。

既存記事とは何が違う?

既存のラムダ式記事や関数型インターフェース記事は構文と概念が中心です。この記事は、Runnableという具体例を使って処理を渡す読み方に絞ります。

次に何を読めばよい?

次に読む記事は、本文末尾の内部リンクから選ぶのがおすすめです。基礎概念が不安なら親記事へ戻り、コードの応用を見たい場合は関連する文法やライブラリの記事へ進むと理解がつながります。

既存記事とあわせて読む順番

関数型インターフェース、ラムダ式、Runnable、Threadの順に読むと、処理を値のように渡して実行する流れがつながります。

公式情報と関連して読みたい記事

まとめ

Runnableは、戻り値のない処理を表すJavaの関数型インターフェースです。

  • Runnableは実行する処理そのものを表す
  • 中心になるメソッドはrun
  • Runnable単体では新しいThreadを作らない
  • ラムダ式で短く書ける

Runnableを理解すると、Threadやラムダ式のサンプルコードで処理の受け渡しを読みやすくなります。

タイトルとURLをコピーしました