java入門 第18回 並列処理


第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);
 }
 
}