1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java スレッド基礎

Posted at

スレッドとは

スレッドは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
*/
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?