thread

L3. Necessary Java Programming
Techniques
(Thread)
Java API
スレッド(thread): アプリケーションから一部の機能をスレッドとして実行します。
スレッドはプログラムに一部の機能を実行している主体です。
マルチスレッド: 同時に複数のスレッドが存在する。それらのスレッド
が並行して動作するのは,マルチスレッド処理機能です。これはJava
言語の特徴の一つです。
Javaでは、スレッドというのは、一つのオブジェクトです。
クラススレッドのコンストラクタ
クラススレッドのインスタンス
public Thread()
Thread thread1, thread2;
public Thread(String threadName)
thread1 = new Thread();
……
thread2 = new Thread(“student”);
java.lang.Object
|
+--java.lang.Thread
スレッドのライフサイクル
(Life cycle of a thread)
スレッド状態 (スレッドのライフサイクル):誕生=>レディ=>実行=>死亡。
誕生
待機
休眠
中断
ブロック
start
実行可能
yield
dispatch
実行
待機
休眠
中断
ブロック
resume
スリープ時間が経過
stop
死亡
クラスThreadのメソッド
実行結果 ex2
(The Thread methods)
public void start()
IllegalThreadStateException
runメソッドを起動し、期待された仕事を行う。
public final void stop()
SecurityException
ThreadDeathオブジェクトを送出することによってスレッドを停止させる。
public final void suspend()
スレッドの実行を中断される。
public final void resume()
中断されたスレッドを再開させる。
public static void sleep(long millis)
InterruptedException
スレッドを眠らせる。
public final void wait()
ターゲットオブジェクトを待つためにwaitメソッドを呼び出し、待機状態に入る。
public final void notify()
待ち行列の先頭にあるスレッドが実行可能状態に移る。
IllegalMonitorStateException
public final void notifyAll()
待ち行列にあるスレッドがすべて実行可能状態に移る。
public final void setName(String name)
スレッドの名前を設定する。
public final String getName()
スレッドの名前を返す。
public static Thread currentThread()
カレントスレッドへの参照を返す。
public final boolean isAlive()
スレッドが生きているかを判断する。
SecurityException
public void run()
スレッドstart()を呼び出すとき、
run()メソッドを起動します。
スレッドクラスの定義
Definition of a thread class
キーワード
class
スレッドクラス名前
thread_name
……
キーワード
キーワード
extends
Thread {
// 必要な変数とコンストラクタの宣言
public void run(){
必ずrun()メソッドの
再定義が必要です。
……
}
}
スレッド
CountTenThreadの
定義
スレッドcttのrunメ
ソッドの実行開始
class CountTenThread extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("run:i = " + i);}}
}
public class ThreadTest {
public static void main(String[] args) {
CountTenThread ctt = new CountTenThread();
ctt.start();
for (int i = 0; i < 10; i++) {
System.out.println("main:i = " + i);}}
}
CountTenThreadのスレッド。
runメソッドが終ると消滅。
mainのスレッド
CoffeeShop
class CoffeeShop
class ShopMaster
class Counter
class CoffeeDrinker
itao
counter
master
putCoffee()
getCoffee()
honkon
higashino
Output:
Master made a COFFEE
[Coffee]
itao can drink a COFFEE!
[]
honkon can NOT drink a COFFEE!
higashino can NOT drink a COFFEE!
Master made a COFFEE
[Coffee]
honkon can drink a COFFEE!
[]
higashino can NOT drink a COFFEE!
Master made a COFFEE
[Coffee]
higashino can drink a COFFEE!
[]
Master made a COFFEE
[Coffee]
Master made a COFFEE
[Coffee, Coffee]
honkon can drink a COFFEE!
[Coffee]
higashino can drink a COFFEE!
[]
itao can NOT drink a COFFEE!
honkon can NOT drink a COFFEE!
Master made a COFFEE
[Coffee]
itao can drink a COFFEE!
[]
honkon can NOT drink a COFFEE!
higashino can NOT drink a COFFEE!
Master made a COFFEE
[Coffee]
Exercise 1 – Thread & Vector
• プログラム「CoffeeShop」を改良して、プログラム
「VideoShop」を作る。
• プログラム「VideoShop」は、ビデオのレンタルを仮想的に実
現させる。
• プログラム「VideoShop」は以下の3つのクラスで成り立つ:
– VideoShop
• mainメソッドを持ち、RackとUserを生成後、Userをスタートさせる。
– Rack
• Vectorとしてビデオ郡を保持する。コンストラクタで、適当にビデオを登録
しておく。「借りる」メソッドと「返す」メソッドを提供する。
– User
• Threadとして稼動する。乱数によって借りるビデオを決め、Rackから「借
りる」。乱数によって決まった時間分Sleepし、Rackにビデオを「返す」。こ
れを繰り返す。
VideoShop
class VideoShop
class Rack
Rack
returnVideo()
borrowVideo()
class User
A thread class
itao
honkon
higashino
Exercise 1 – Class Diagram
has
has
has
Exercise 1 – 実行例
板尾が「スターウォーズ1」を借り
ているため、東野は借りれない
(waitする)。
板尾が「スターウォーズ1」を返し
た(notifyAllしてwaitを解除させ
る)。
東野は無事、「スターウォーズ1」
を借りることができた。
VideoShopEx.java