JavaでRunnableインターフェースを明示的に実装せずにスレッドを作成する方法
スレッドは軽量プロセス(ライトウェイト・プロセス)と呼ばれることがあります。Javaはマルチスレッドを標準でサポートしており、アプリケーション内で2つ以上のタスクを同時に実行できます。
すべてのJavaプログラムには、少なくとも1つのメインスレッドが存在します。このメインスレッドは、プログラムの起動時にJava Virtual Machine(JVM)によって作成され、その上でmain()メソッドが実行されます。
Javaでスレッドを作成する一般的な方法としては、次の2つが知られています。
- Threadクラスを継承する
- Runnableインターフェースを実装したクラスを定義する
しかし、専用のクラスを宣言してimplements句を書かなくても、匿名クラス(無名内部クラス)を利用すれば、その場でRunnableの処理を定義しながらスレッドを生成できます。以下にその例を示します。
サンプルコード
public class CreateThreadWithoutImplementRunnable { // implements 句なしで作成
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i <= 5; i++) {
System.out.println("run() method of Runnable interface: " + i);
}
}
}).start();
for (int j = 0; j <= 5; j++) {
System.out.println("main() method: " + j);
}
}
}実行結果
main() method: 0
run() method of Runnable interface: 0
main() method: 1
run() method of Runnable interface: 1
main() method: 2
run() method of Runnable interface: 2
main() method: 3
run() method of Runnable interface: 3
main() method: 4
run() method of Runnable interface: 4
main() method: 5
run() method of Runnable interface: 5
コードのポイント
new Thread(new Runnable() { ... })のように、Runnableインターフェースの実装を匿名クラスとしてインラインで記述しています。別途クラスファイルや名前付きクラスを用意する必要がありません。- 匿名クラス内で
run()メソッドをオーバーライドし、その中にスレッドで実行したい処理を記述します。 start()を呼び出すことで新しいスレッドが起動し、run()内の処理がメインスレッドと並行して実行されます。- 実行結果を見ると、
main()メソッドの出力とrun()メソッドの出力が交互に現れており、2つのスレッドが同時(並行)に動作していることが確認できます。なお、出力順序はスレッドスケジューラの状態によって変わる可能性があります。
補足:ラムダ式によるさらに簡潔な書き方
Java 8以降では、Runnableが関数型インターフェースであるため、ラムダ式を使うと同じ処理をより簡潔に書くこともできます。
new Thread(() -> {
for (int i = 0; i <= 5; i++) {
System.out.println("Lambda run(): " + i);
}
}).start();このように、Runnableを明示的に実装したクラスを定義しなくても、匿名クラスやラムダ式を活用することで、手軽にマルチスレッド処理を実現できます。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ