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

Runnableは『実行する作業メモ』、Threadは『実行する流れ』と分けて覚えると、混乱しにくくなります。
この記事では、Runnableの意味、runメソッド、Threadとの違い、ラムダ式で書ける理由を初心者向けに整理します。
まず結論:Runnableは処理そのものを表す
Runnableは、戻り値のない処理を表す関数型インターフェースです。Java公式APIでも、結果を返さない操作を表すものとして説明されています。
次の図で、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は、処理の中身をまとめて名前を付けられる形です。メソッドを呼ぶ側と、処理の中身を作る側を分けたいときに役立ちます。
Threadとの違い
RunnableとThreadの違いは、初心者が最も混乱しやすいポイントです。Runnableは作業内容、Threadは実行の流れだと分けて考えます。
| 比較 | Runnable | Thread |
|---|---|---|
| 役割 | 実行する処理を表す | 処理を実行する流れを表す |
| 中心メソッド | 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()の違いを整理してください。

Runnableを理解すると、Threadのコードを読んだときに『処理の中身』と『実行の始まり』を分けて追えるようになります。
ラムダ式で書ける理由
Runnableは抽象メソッドがrun()だけの関数型インターフェースです。そのため、Javaのラムダ式で短く書けます。
Runnable task = () -> {
System.out.println("hello");
};
new Thread(task).start();
ラムダ式そのものはJavaのラムダ式で、関数型インターフェースの考え方は関数型インターフェースの記事で詳しく扱っています。Runnableは、その代表的な例として読むと理解しやすいです。
次の図では、匿名クラスからラムダ式へ書き方が短くなる流れを確認してください。

短く書けること自体よりも、『runに入れる処理を渡している』と読めることが大切です。
Runnableを使う場面
戻り値が必要な並行処理ではCallableなど別の選択肢もあります。初心者の段階では、まずRunnableを『戻り値なしの処理を渡す形』として理解しましょう。
実務コードで読むときのコツ
実務コードでRunnableが出てきたら、最初に見るべきなのは『何を担当しているのか』です。名前だけを暗記するより、値を順番に取り出すのか、処理を渡すのか、別の実行の流れを作るのかを日本語に直す方が理解しやすくなります。
次に、型、呼び出しているメソッド、戻り値の3つを順番に確認します。型を見ると役割の範囲が分かり、メソッドを見るとその行で何をしたいのかが分かり、戻り値を見ると次の処理へどうつながるかが分かります。
この記事の範囲では、細かい内部実装をすべて覚えることよりも、初見のコードで立ち止まらないことを優先しています。必要になったら公式APIを確認しながら、まずは代表的な書き方を読める状態を作りましょう。
チーム開発では、同じ目的を複数の書き方で実現できることがあります。そのため『この書き方だけが正解』と覚えるのではなく、なぜその場面でそのクラスやインターフェースが選ばれているのかを考えるのが大切です。
サンプルコードと実務コードでは情報量が違います。実務コードでは、変数名、メソッド名、例外処理、戻り値の受け渡しが同時に出てきます。読み始めで混乱したら、まずこのページで扱った最小コードまで戻し、1行ずつ役割を書き出すと整理できます。
判断に迷ったときの基準
Runnableを使うべきか迷ったときは、先に目的を言葉にしてみます。目的が曖昧なままコードを書き始めると、似たクラスや似た構文との違いが見えなくなります。
| 確認すること | 見るポイント |
|---|---|
| 扱いたい対象 | 値、一覧、処理、実行の流れなど何を扱うのか |
| 必要な操作 | 取り出す、渡す、開始する、待つ、変換するなど何をしたいのか |
| 既存記事との関係 | 基礎文法、コレクション、インターフェース、ラムダ式のどれにつながるか |
| 注意点 | 順番、戻り値、例外、状態変更、実行タイミングなど見落としやすい点 |
この4点を先に確認すると、単なる暗記ではなく、コードを読むための判断軸ができます。初心者向けの記事でも、この判断軸まで持てると次の応用記事へ進みやすくなります。
練習問題
理解を確認するために、次の観点でサンプルコードを自分で説明してみてください。実行できる環境がある場合は、少し値を変えて結果がどう変わるかも試すと定着しやすくなります。
練習では、正確な用語を最初から完璧に使う必要はありません。まずは『何を受け取り、何を実行し、どのタイミングで次へ進むのか』を自分の言葉で言えることを目標にしてください。
よくある疑問
最初から細かい仕様まで覚えるべき?
最初からすべてのメソッドや内部仕様を暗記する必要はありません。初心者の段階では、代表的な使い方、よくあるつまずき、既存記事とのつながりを押さえれば十分です。必要になったタイミングで公式APIを確認する習慣を作りましょう。
既存記事とは何が違う?
既存のラムダ式記事や関数型インターフェース記事は構文と概念が中心です。この記事は、Runnableという具体例を使って処理を渡す読み方に絞ります。
次に何を読めばよい?
次に読む記事は、本文末尾の内部リンクから選ぶのがおすすめです。基礎概念が不安なら親記事へ戻り、コードの応用を見たい場合は関連する文法やライブラリの記事へ進むと理解がつながります。
既存記事とあわせて読む順番
関数型インターフェース、ラムダ式、Runnable、Threadの順に読むと、処理を値のように渡して実行する流れがつながります。
公式情報と関連して読みたい記事
まとめ
Runnableは、戻り値のない処理を表すJavaの関数型インターフェースです。
Runnableを理解すると、Threadやラムダ式のサンプルコードで処理の受け渡しを読みやすくなります。
