第18回のポイント
並列処理(スレッド)って?
プログラムの処理の流れを分けて並行動作させ、効率的にプログラムの実行を行うスレッドの作成方法は2種類
Threadクラスを継承して、runメソッド内に並行処理する命令を記述するRunnableインターフェースを実装してrunメソッド内に並行処理する命令を記述する
スレッドの実行方法は Threadクラスを継承した場合 オブジェクトを作成し、startメソッドで実行
Runnableインターフェースを実装した場合 オブジェクトを作成し、そのオブジェクトを元にThreadオブジェクトを作成し、startメソッドで実行
sleep,join
Thread.sleep(1000);//1000ミリ秒処理を停止するjoin文でスレッド処理が終了するのを待ちます
synchronized(同期)
メソッドにsynchronized修飾子を付けるとそのメソッドには1度に1つのスレッドしか処理できない (排他処理) スレッド処理において処理の矛盾を起こさない仕組みgoogleドライブ上にこの講座のプログラムコード、スライドデータを置いています。 https://drive.google.com/folderview?id=0B7jeGhcD18UYM0JtUG8xQm1CeU0&usp=sharing
以下は実際にビデオの中で作成したプログラムです。
import java.io.IOException;
public class Study18 {
public static void main(String[] args) {
Yoyaku_svc.zaseki=5;//座席数を設定
Yoyaku_svc ys = new Yoyaku_svc();
ys.start();
User[] user = new User[5];
Thread[] th = new Thread[5];
for(int i=0;i<user.length;i++){
user[i]=new User();
th[i] = new Thread(user[i]);
th[i].start();
}
try {
ys.join();
System.out.println("予約受付を完了しました。");
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
class Yoyaku_svc extends Thread{
static int zaseki;//座席数
synchronized static void yoyaku(){
Yoyaku_svc.zaseki--;
}
public void run(){
while(Yoyaku_svc.zaseki!=0){
System.out.println(" 残り座席数は"+Yoyaku_svc.zaseki+"席です");
try {
sleep(500);//2秒待つ
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}
}
class User implements Runnable{
@Override
public void run() {
int time = (int) (Math.random()*1000+1000);//1秒から2秒 ランダムに生成
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
Yoyaku_svc.yoyaku();
System.out.println("予約手続きをしました"+time);
}
}
0 件のコメント:
コメントを投稿