Java -スレッドの生成-
スレッドとは
プロログラムの中で独立して実行する一連の処理のことです。
Javaでは、java.lang.Threadクラスオブジェクトを生成することで、新しいスレッドを作成することができます。
Threadクラスの主なメソッド
メソッド | 説明 |
---|---|
static Thread currentThread() | 現在実行中のスレッドの参照を取得します。 |
String getName() | スレッドの名前を取得します。 |
int getPriority() | スレッドの優先順位を取得します。 |
static boolean holdsLock(Object obj) | 現在のスレッドが指定されたオブジェクトをロックしているか調べます。 |
void interrupe() | スレッドに割り込みをします。 |
void join() throws InterruptedException | スレッドが終了するのを待機します。 |
void join(long millis) throws InterruptedException | スレッドが終了するのを最高でmillisミリ秒待機します。 |
void join(long millis,int nanos) throws InterruptedException | 最高でmillisミリ秒にnanosナノ秒を加算した間、このスレッドが終了するのを待機します。 |
void run() | スレッドで実行する処理を記述します。 |
void setName(String name) | スレッドの名前を変更します。 |
void setPriority(int newPriority) | スレッドの優先順位を変更します。 |
static void sleep(long millis) throws InterruptedException | 現在実行中のスレッドを、指定されたミリ秒数の間、一時的に実行を停止します。 |
static void sleep(long millis,int nanos) throws InterruptedExceptio | 現在実行中のスレッドを、指定されたミリ秒数にナノ秒数を加算した間、一時的に実行を停止します。 |
void start() | スレッドの実行を開始します。 |
String toString() | スレッドの名前、優先順位、スレッドグループを含むこのスレッドの文字列表現を取得します。 |
static void yield() | 現在実行中のスレッドオブジェクトを一時的い休止させ、他のスレッドを実行可能な状態に遷移させます。 |
スレッドの生成方法
- Threadオブジェクトを生成
- 手順1で作成したThreadオブジェクトのstartメソッドを呼び出します。
オーバーライドされたrunメソッドが呼び出され、処理が行われます。
Threadオブジェクトの生成方法
Threadクラスを継承するサブクラスを作成し、サブクラスのオブジェクトを生成します。
Threadクラスのサブクラスを定義する。
そのため、他のクラスを継承する必要がある場合は利用できません。
Threadクラスのコンストラクタの引数にRannableインタフェースを実装したクラスオブジェクトを指定し、Threadオブジェクトを生成します。
Rannableインタフェースを実装するクラスを定義します。
Threadクラスの主なコンストラクタ
- Thread() → 方法1
- Thread(String name) → 方法1
- Thread(Runnable target) → 方法2
- Thread(Runnable target, String name) → 方法2
引数nameでスレッドの名前を指定可能
自動作成される名前は "Thread" + n (nは整数値)
Threadオブジェクトの生成(方法1)
Threadクラスを継承するサブクラスを定義し、サブクラスのオブジェクトの生成する方法
定義したサブクラスはThreadから継承したstartメソッドを持ち、startメソッドを呼び出すことでrunメソッドがスレッド上で実行されます。
サンプル1
class Thread01 extends Thread {
// runメソッドのオーバーライド
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread:" + i);
}
System.out.println("Thread---End---");
}
}
public class ThreadTestEx01 {
public static void main(String[] args) {
// Threadオブジェクト生成
Thread01 t = new Thread01();
// startメソッド呼び出しによりrunメソッドが呼び出されます。
t.start();
for (int j = 0; j < 5; j++) {
System.out.println("main:" + j);
}
System.out.println("main---End---");
}
}
サンプル1の表示結果(実行の度に表示結果は毎回異なります)
main:0 main:1 Thread:0 Thread:1 Thread:2 Thread:3 main:2 main:3 main:4 main---End--- Thread:4 Thread---End---
サンプル3(無名クラスを利用した場合
public class ThreadTestEx03 {
public static void main(String[] args) {
// Threadオブジェクト生成
Thread t = new Thread(){
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread:" + i);
}
System.out.println("Thread---End---");
}
};
// startメソッド呼び出しによりrunメソッドが呼び出されます。
t.start();
for (int j = 0; j < 5; j++) {
System.out.println("main:" + j);
}
System.out.println("main---End---");
}
}
Threadオブジェクトの生成(方法2)
Threadクラスのコンストラクタの引数として、Runnableインタフェースを実装したクラスのオブジェクトを指定し、Threadオブジェクトを生成する方法
Threadクラスのstartメソッドを呼び出すことで、Runnableインタフェースを実装したクラスのオブジェクトが持つrunメソッドが呼び出されます。
サンプル2
class Thread02 implements Runnable {
// runメソッドのオーバーライド
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread:" + i);
}
System.out.println("Thread---End---");
}
}
public class ThreadTestEx02 {
public static void main(String[] args) {
// Threadオブジェクト生成
Thread t = new Thread(new Thread02());
// startメソッド呼び出しによりrunメソッドが呼び出されます。
t.start();
for (int j = 0; j < 5; j++) {
System.out.println("main:" + j);
}
System.out.println("main---End---");
}
}
サンプル2の表示結果(実行の度に表示結果は毎回異なります)
main:0 main:1 Thread:0 Thread:1 Thread:2 Thread:3 Thread:4 Thread---End--- main:2 main:3 main:4 main---End---
サンプル4(無名クラスを利用した場合)
public class ThreadTestEx04 {
public static void main(String[] args) {
// Threadオブジェクト生成
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread:" + i);
}
System.out.println("Thread---End---");
}
});
// startメソッド呼び出しによりrunメソッドが呼び出されます。
t.start();
for (int j = 0; j < 5; j++) {
System.out.println("main:" + j);
}
System.out.println("main---End---");
}
}