スレッド
ソフトウェア(プログラム)の実行単位
1つのプログラムは最低1つのスレッドが存在する
public class SingleThreadExample {
public static void main(String[] args) {
syso("working");
}
}
上記プログラムを実行するとmainメソッドの処理を行う1つのスレッドが起動する。
→スレッドを1つだけ起動させるプログラムを【シングルスレッド】のプログラムという。
シングルスレッドのプログラムに対して複数スレッドが動くプログラムを【マルチスレッド】のプログラムと言う。
マルチスレッドプログラムの作成方法
Javaでマルチスレッドのプログラムを作成するには、スレッド生成のクラスを作成する必要がある。
スレッドの生成クラスの作成方法2つ
・Threadクラスを継承する方法
・Runnableインタフェースを実装する方法
【Threadクラスを継承する方法】
Threadクラスのサブクラスを作成
run()メソッドをオーバーライド
スレッドで処理したい内容を記述
public class ExtendingThreadSample extends Thread {
public void run() {
//any operation
}
}
次に
ExtendingThreadSampleをインスタンス化
インスタンスのstart()メソッドを呼ぶ
ことでスレッドが起動する。
public class MainClass {
public static void main(String[] args) {
ExtendingThreadSample th = new ExtendingThreadSample();
th.start();
}
}
スレッドを起動させる為に呼ぶメソッドはrun()メソッドではなく、start()メソッドである。
start()メソッドを呼び出したタイミングですぐにスレッドが実行されるわけではなく、
スレッドスケジューラに登録されるだけで、いつ実行するかはスレッドスケジューラが決定権を持つ。
【Runnableインタフェースを実装する方法】
Runnableインタフェースを実装
Runnableの抽象メソッドrun()メソッドを定義
スレッドで処理したい内容を記述
public class ImplementingRunnableSample implements Runnable {
public void run() {
//any operation
}
}
起動・実行するには
ImplementingRunnableSampleをインスタンス化
インスタンスをコンストラクタ引数として Threadクラスをインスタンス化
Threadクラスのインスタンスのstart()メソッドを呼ぶ
public class MainClass {
public static void main(string[] args) {
ImplementingRunnableSample myThread = new ImplementingRunnableSample();
Thread th = new Thread(myThread);
th.start();
}
}
Runnableインタフェースを実装したクラスには、start()メソッドがない為、
スレッドスケジューラに登録できない。
→Threadクラスのインスタンスを作成し、start()を呼んで実行する。
--------------------------------------------------
Q1 間違ってるのは?
a. スレッドを生成するクラスを作成する場合、Threadクラスを継承すればよい。
b. スレッドの実行開始はrun()メソッドを呼び出すことで行う。
c. スレッドを生成するクラスを作る場合、Runnableインタフェースを実装すればよい。
d. スレッドの実行開始はstart()メソッドを呼んで行う。
A1
b
start():スレッドを実行開始するメソッド
run():スレッドの処理内容を記述するメソッド
--------------------------------------------------
Q2 正しいのは?
01:class ThreadSample extends Thread {
02: public void run() {
03: for (int i=0; i<5; i++) {
04: System.out.println("hoge");
05: }
06: }
07:}
08:public class MainSample {
09: public static void main(String[] args) {
10: ThreadSample th = new ThreadSample();
11: th.run();
12: }
13:}
a. 10行目でコンパイルエラー
b. 12行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される
A2
d
スレッドの実行開始には、run()でなく、start()を呼ぶ。
run()を呼んだ場合は、スレッドとして実行されず、
同スレッドでrun()が実行されるだけ。
--------------------------------------------------
Q3 正しいのは?
01:classThreadSample implements Runnable {
02: public void run() {
03: for (int i=0; i<5;i++) {
04: System.out.println("hoge");
05: }
06: }
07:}
08:public class MainSample {
09: public static void main(Strng[] args) {
10: ThreadSample th = new ThreadSample();
11: th.start();
12: }
13:}
a. 10行目でコンパイルエラー
b. 11行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される
A3
b
10行目では問題なくインスタンス化されるが
ThreadSampleクラスはThreadクラスのサブクラスでないので
start()は呼び出せない。
--------------------------------------------------
Q4 (A)に入るのは?
01:public class ThreadSample implements Runnable {
02: public void run() {
03: for (int i=0; i<5; i++) {
04: System.out.println("hoge");
05: }
06: }
07: public static void main(String[] args) {
08: (A)
09: }
10:}
a. new ThreadSample().start();
b. new Thread(new ThreadSample()).start();
c. new Thread(ThreadSample).start();
d. new Thread(new ThreadSample()).run();
A4
b
--------------------------------------------------
Q5 正しいのは?
01:public class ThreadSample extends Thread {
02: public void run() {
03: for (int i=0; i<5; i++) {
04: System.out.println("hoge");
05: }
06: }
07:}
08:public class MainSample {
09: public static void main(String[] args) {
10: ThreadSample th = new ThreadSample();
11: Thread t = new Thread(th);
12: t.start();
13: }
14:}
a. 10行目でコンパイルエラー
b. 11行目でコンパイルエラー
c. 実行時にエラー
d. 問題なく実行される
A5
d
--------------------------------------------------
Q6 Threadクラスのインスタンスメソッドは?
a. sleep(long msec);
b. start();
c. wait();
d. run();
e.notifyAll();
f. join();
A6
○a. sleep(long msec);
○b. start();
×c. wait();
○d. run();
×e.notifyAll();
○f. join();
Thread#run(): スレッドの処理内容の実行
Thread#start():スレッド自体の実行開始
Thread#join():他のスレッドの実行終了を待機
THread#sleep(long msec):スレッドの実行を一時停止(static method)
Object#wait():他のスレッドからnotify()かnotifyAll()メソッドで呼ばれるまで待機
Object#notifyAll():待機している全スレッドを実行再開
goto
[J2SE1.4] INDEX