////////////////////////////////////////////////////////////////////////////////
//  << j501.java >>
//
//  スレッド(0):スレッド(概説)
//  
// ●スレッド
//
//    ・プログラム中の処理の流れをスレッドという。
//  ・簡単なプログラムでは、スレッドはひとつであるが、並行処理を行うプログラム
//     では、複数のスレッド(マルチスレッド)を実行させる。各スレッドは同時に
//     処理が進められる。
//     スレッドが同時に実行されているといってもプロセッサはひとつである。
//   したがって、本当に同時に実行されているわけではない。各スレッドに少しづつ
//   プロセッサの実行時間が順に割り当てられている。
//   この結果、各スレッドが同時に実行されているように見える。
//
//  ・プロセスとの違い
//   プロセス(プログラムが実行中の状態をいう)も同時に並行して実行できるが、
//   スレッドは、ひとつのプロセス中で並行処理できる単位である。
//   すなわち、ひとつのインスタンス変数に異なるスレッドからアクセスできる。
//
//  ●スレッドの作成法(2通りある)
//
// 方法1:Threadクラスを継承する方法。
//        子クラス(Thread1)でThreadクラスのrun()メソッドをオーバーライドする。
//
//        class Thread1 extends Thread {
//          public void run() {
//            処理内容を記述する部分
//          }
//        }
//        class クラス名 {
//          public static void main(String args[]) {
//      Thread1 th = new Thread1(); // スレッドの作成。
//            th.start(); // スレッドの実行。
//          }
//        } 
//
//    ・start()メソッドによって、スレッドの実行が始まる。そのスレッドの
//     runメソッドが呼び出され実行が始まる。制御は、すぐにstart()メソッドを
//     呼び出した所に戻る。そして、呼び出した元のスレッドの実行を続ける。
//
// 方法2:Runnableインターフェースを実装する方法。
//     run()メソッドをオーバーライドする。
//
//        class Thread2 implements Runnable {
//          public void run() {
//            処理内容を記述する部分
//          }
//        }
//        class クラス名 {
//          public static void main(String args[]) {
//            Thread2 r = new Thread2();
//            Thread th = new Thread(r); // スレッドの作成。
//            th.start(); // スレッドの実行。
//          }
//        } 
//
//    ・Runnableインターフェースを実装したクラスのオブジェクトを
//     Threadクラスのコンストラクタに渡すことにより、Threadオブジェクトを
//     作成する。
//        ・Javaでは、ひとつのクラスしか継承できない。
//     「class C1 extends C2,Thread{・・・}」のような場合に対応するため
//     Runnableインターフェースが用意されている。
//
////////////////////////////////////////////////////////////////////////////////