スレッドとは
スレッドは1つの流れの処理を表す単位。
スレッドの処理が単一で行われるをのをシングルスレッド、複数のスレッドを同時に並行させることをマルチスレッドという。
スレッド作成
Threadクラス
1つめはThreadクラスを継承したクラスを使用する方法。
runメソッドをオーバーライドして、スレッドとしての処理を記述する。
class Sub extends Thread {
public void read() {
//処理
}
}
そして、そのクラスのインスタンスでstartメソッドを実行すれば、runメソッドが実行される。
public class Main {
public static void main(String[] args) {
Sub sub = new Sub();
sub.start(); //スレッド実行と表示
}
}
class Sub extends Thread {
public void run() {
System.out.println("スレッド実行");
}
}
Runnableインターフェース
2つめはRunnableインターフェースを実装する方法
Runnableインターフェースはrun()メソッドのみを持つ。そのためrun()メソッドだけをオーバライドすれば良い。
class Sub implements Runnable {
public void run() {
//処理
}
}
1.Runnableインターフェースを実行したクラスのインスタンスを生成し、
2.Threadクラスのインスタンス生成時に1のインスタンスを引数にする
3.startメソッドを2のインスタンスで実行する
public class Main {
public static void main(String[] args) {
Sub sub = new Sub();
Thread thread = new Thread(sub);
thread.start(); //スレッド実行と表示
}
}
class Sub implements Runnable {
public void run() {
System.out.println("スレッド実行");
}
}
マルチスレッド
複数のスレッドを実行する。
スレッドクラスを継承したクラスのインスタンスを複数生成して、それぞれでスレッドを実行するやり方。
public class Test1 {
public static void main(String[] args) {
Country a1 = new Country("Japan");
Country a2 = new Country("America");
a1.start();
a2.start();
System.out.println("end");
}
}
class Country extends Thread {
private String country;
Country(String country) {
this.country = country;
}
@Override
public void run() {
for (int i = 0; i < 2; i++) {
System.out.println(country);
}
}
}
/* ----実行結果-----
end
Japan
Japan
America
America
*/
他スレッドの終了を待つ
マルチスレッドにおいて、他スレッドの処理が終わるまで待機するにはjoinメソッドを使用する。
oin()は該当のスレッドが終了するのを永久に待ちつづける。
public class Main {
public static void main(String[] args) throws Exception {
JoinTest t = new JoinTest();
t.start();
System.out.println("スレッド t の終了を待機します。");
t.join(); // tのスレッドが終了するのを待つ
System.out.println("スレッド t が終了しました。");
}
}
class JoinTest extends Thread {
public void run() {
for (int i = 3; i >= 0 ; i--) {
System.out.println(i);
}
}
}
----実行結果-----
/*
スレッド t の終了を待機します。
3
2
1
0
スレッド t が終了しました。
*/
---joinを消した場合----
/*
スレッド t の終了を待機します。
スレッド t が終了しました。
3
2
1
0
*/