Javaのマルチスレッドのサンプルです。
目次
サンプル | マルチスレッド |
マルチスレッドで実行する(Threadクラス) | |
マルチスレッドで実行する(Runnableインターフェース) | |
指定したスレッドの終了を待つ(join) |
マルチスレッド
- 複数のスレッドが並行で処理されることです。
- Threadクラスを継承する、またはRunnableインターフェースを実装します。
- 上から順に1つのスレッドで処理するのはシングルスレッドです。
マルチスレッドで実行する(Threadクラス)
public class Thread extends Object implements Runnable |
public void run() |
- メインスレッドとは別に新規のスレッドが作成されます。
- Threadクラスを継承したクラスはrunメソッドをオーバーライドする必要があります。
- 以下はJava8 API仕様のThreadクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html
Threadクラスを使用したサンプルです。
package test1;
class Color1 extends Thread{
private String col;
Color1(String col){
this.col = col;
}
@Override
public void run(){
for (int i = 0;i<2;i++){
System.out.println(col);
}
}
}
class Color2 {
void display(){
System.out.println("オレンジ");
}
}
public class Test1 {
public static void main(String[] args) {
Color1 c1 = new Color1("red");
Color1 c2 = new Color1("yellow");
Color1 c3 = new Color1("blue");
Color2 col1 = new Color2();
c1.start();
c2.start();
c3.start();
col1.display();
}
}
3行目は、Threadクラスを継承しています。
9行目は、Threadクラスのrunメソッドのオーバーライドしています。
22~25行目は、それぞれクラスをインスタンス化しています。
27-29行目は、startメソッドでスレッドの実行を開始しています。runメソッドが呼び出されます
結果
1.マルチスレッドで動くため何回か実行すると出力される順番が変わります。
以下は1回目の実行です。
以下は2回目の実行です。
2.デバッグモードで実行中のスレッドを確認したところです。
mainスレッドの他に作成した3つのスレッドがあります。
マルチスレッドで実行する(Runnableインターフェース)
@FunctionalInterface public interface Runnable |
void run() |
- メインスレッドとは別に新規のスレッドが作成されます
- Runnableインターフェースを実装したクラスはrunメソッドをオーバーライドする必要があります
- 挙動はThreadクラスと同じです
- 以下はJava8 API仕様のRunnableインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Runnable.html
Runnableインターフェースを使用したサンプルです。
package test1;
class Color1 implements Runnable{
private String col;
Color1(String col){
this.col = col;
}
@Override
public void run(){
for (int i = 0;i<2;i++){
System.out.println(col);
}
}
}
class Color2 {
void display(){
System.out.println("オレンジ");
}
}
public class Test1 {
public static void main(String[] args) {
Color1 c1 = new Color1("red");
Color1 c2 = new Color1("yellow");
Color1 c3 = new Color1("blue");
Color2 col1 = new Color2();
new Thread(c1).start();
new Thread(c2).start();
new Thread(c3).start();
col1.display();
}
}
3行目は、Runnableインターフェースを実装しています。
9行目は、Runnableインターフェースのrunメソッドのオーバーライドしています。
22-25行目は、それぞれクラスをインスタンス化しています。
27~29行目は、startメソッドでスレッドの実行を開始しています。runメソッドが呼び出されます。
指定したスレッドの終了を待つ
public final void join() throws InterruptedException |
Threadクラスのjoinメソッドは、指定したスレッドの終了を待ちます。
package test1;
class Color1 extends Thread{
private String col;
Color1(String col){
this.col = col;
}
@Override
public void run(){
System.out.println(col);
}
}
public class Test1 {
public static void main(String[] args) {
Color1 c1 = new Color1("red");
Color1 c2 = new Color1("yellow");
c1.start();
try {
c1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
c2.start();
}
}
17行目は、c1のスレッドが開始されます。
19行目は、joinメソッドです。スレッドの終了を待ちます。
23行目は、c1のスレッドの処理が終了してから実行されます。
関連の記事