Thread(スレッド)というものに出くわしたから、今回はthreadいついてまとめた。
Threadはどのようなものか、またどのように使用するのかについて見ていく。
Threadとは?
「道筋」や「脈絡」といった意味がある。
プログラミングでは処理の流れのことを指す。
1つの処理で完結するプログラムをシングルスレッド(single thread)。
同時に複数のプログラムが処理されるのをマルチスレッド(multiple thread)という。
Javaはマルチスレッドのプログラミング言語。
複数の処理が一度に実行されることで、ゲームができたりする。
Threadを使用するメリット
以下が主に(複数の)Threadを使用するメリットとして挙げられるもの。
普通は上から順番に一つ一つ実行されるため時間がかかる。
だかマルチスレッドを作成することで、複数の処理を同時進行で行うことができるようになる。
Javaプログラミングにおいて重要なもの。
Thread(スレッド)の作成方法
Threadを作成するには2通りの方法がある。
Threadクラスを継承して使用する
ThreadクラスはJava APIの一つ。
APIについては以下参照。
【Javaプログラミング】APIとは?使い方についても-プロショvol.64
すでにJavaに用意されているプログラムで、「java.lang」というパッケージに「Threadクラス」が存在する。
継承する場合は「import」などは不要。
継承させたいクラスに「extends」を付けて「Threadクラス」を引き継がせることができる。
extends、継承については以下参照。
【Javaプログラミング】継承とは?スーパークラスとサブクラスについても -プロショvol.49
以下にThreadクラスを使用したプログラムを作成してみた。
public void run() {
System.out.println(“走っている”);
}
}
class WAITING extends Thread{
public void run(){
System.out.println(“待っている”);
}
}
public class Sample {public static void main(String[] args) {
RUNNING running = new RUNNING();
WAITING waiting = new WAITING();
running.start();
waiting.start();
}
}
待っている
RUNNINGクラスとWAITINGクラスがThreadクラスを継承している。
Threadクラスには元からstart()メソッドが組み込まれている。
そのためstart()メソッドを呼び出すことで、「このThreadクラスを実行したい」とJavaに伝えられる。
クラスを実行したいと伝えられると、Javaはメモリ上にスレッドを割り当てる。
メモリ上にスレッドが割り当てられると、run()メソッドが呼び出される。
呼び出されたrun()メソッドは他のスレッドで実行される。
run()メソッドは当該のThreadクラスの中に書かれていないと、実行結果は空白になった。
class RUNNING extends Thread{
}
上の状態でstart()メソッドで呼び出しても何も表示されなかった。
プログラムが強制終了されるか、待機状態になるまでrun()メソッドはずっと呼び出し続けられる。
implements Runnableを使用する
Threadを作るもう一つの方法は「implements Runnable」というプログラムを使用する方法。
implementsは「実装する」という意味。
Runnableは「実行可能、動作可能」という意味がある。
Runnableはクラス。
実行可能なものを実装するってことかね。
まず、先で見たコードの「extends Thread」の部分を「implements Runnable」に変える。
Runnableを実装したクラスに、run()メソッドを作って処理内容を書く。
メインクラス内にThreadクラスのオブジェクトを作成。
オブジェクトの作成方法については以下参照。
自作したクラスに状態を表すデータを作る-オブジェクトの作成方法 by Javaプログラミング初心者 Vol.37
オブジェクトを作成する際、()内にRnnableクラスを実装したクラスのコンストラクタを作成する。
コンストラクタについては以下参照。
コンストラクタって何?使い方は? by Javaプログラミング初心者vol.46
それからstart()メソッドを呼び出す。
public void run() {
System.out.println(“走っている”);
}
}
class WAITING implements Runnable{
public void run(){
System.out.println(“待っている”);
}
}
public class Sample {
public static void main(String[] args) {
Thread running = new Thread(new RUNNING());
Thread waiting = new Thread(new WAITING());
running.start();
waiting.start();
}
}
待っている
Runnableを使用することで、クラスをサブクラスにせずにスレッドを作ることができる。
サブクラスについても継承の記事を参考に。
【Javaプログラミング】継承とは?スーパークラスとサブクラスについても -プロショvol.49
クラスは本来1つからしか引き継ぐことができない。
もしThreadクラスを引き継いだら、ほかのクラスを継承できない。
Runnableを使用すればスレッドを作成し、さらにクラスを引き継ぐことが可能になる。
オブジェクトを作成する場合はThreadクラスから作成するということに注意。
そして()内にはRunnableを実装したクラスのコンストラクタを書く。
「Thread running = new Thread(new RUNNING());」
コンストラクタについては以下参照。
コンストラクタって何?使い方は? by Javaプログラミング初心者vol.46
Threadクラスを継承するときとオブジェクトの作り方が違うから注意。
最後に
Threadクラスを継承することに比べると、implements Runnableの方が少々複雑に見えるかもしれない。
けれど、継承はたった一回しかできない。
そのためThreadクラスを引き継いでしまうと、もうほかのクラスを継承できない。
その点、「implements Runnable」を使用することでスレッドを作成できるほか、別のクラスを継承できる。
簡単なのは継承を使用すること。
便利なのは「implements Runnable」といった感じだろうか。
これでアプリ作成に一歩近づいたかな?
コメント