Thread NowTime Class

ID:2  i:0  Time:07:33:43.6852960
ID:0  i:0  Time:07:33:43.6852960
ID:1  i:0  Time:07:33:43.6852960
ID:0  i:1  Time:07:33:44.0440966
ID:2  i:1  Time:07:33:44.0440966
ID:1  i:1  Time:07:33:44.0440966
ID:0  i:2  Time:07:33:44.4808974
ID:1  i:2  Time:07:33:44.4808974
ID:2  i:2  Time:07:33:44.4808974
ID:0  i:3  Time:07:33:44.7304978
ID:2  i:3  Time:07:33:44.7304978
ID:1  i:3  Time:07:33:44.7304978

NowTime Class のメソッドを Thread で起動します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. スレッドで起動出来るのは、void 型のパラメータ無しのメソッドです。
    パラメータを持たせたいときは、Class として定義します。
    ランダムな間隔を置いて時刻を表示するメソッドに、スレッドを識別する ID を設定します。
    /*******************************************/
    /*★ class NowTime のスレッド    前田 稔 ★*/
    /*******************************************/
    using System;
    using System.Threading;
    
    // Thread で実行する Class
    class NowTime
    {
        int     id;
    
        // Constructor で id を設定
        public  NowTime(int id) {  this.id = id;  }
    
        // ランダムな時間間隔で時刻を出力
        public void Run()
        {
            Random rnd = new Random();
    
            for(int i=0; i<4; ++i)
            {
                Thread.Sleep(rnd.Next(100, 700));   //100 ~ 699 秒中断
                Console.Write("ID:{0}  i:{1}  Time:{2}\n", id,i,DateTime.Now.TimeOfDay.ToString());
            }
        }
    }
    
    class TestThread
    {
        static void Main()
        {
            const int N = 3;        // 同時に実行するスレッド数
            Thread[] threads = new Thread[N];
    
            for(int id=0; id<N; ++id)
            {
                NowTime nowtime = new NowTime(id);
                threads[id] = new Thread(new ThreadStart(nowtime.Run));
                threads[id].Start();
            }
        }
    }
    
  2. NowTime Class の Constructor で id を設定します。
    Thread で起動するメソッドは void 型のパラメータ無しのメソッド(nowtime.Run)です。
    今回は、同時に3個スレッドを実行します。
        public  NowTime(int id) {  this.id = id;  }
            ・・・
        const int N = 3;        // 同時に実行するスレッド数
        Thread[] threads = new Thread[N];
    
        for(int id=0; id<N; ++id)
        {
            NowTime nowtime = new NowTime(id);
            threads[id] = new Thread(new ThreadStart(nowtime.Run));
            threads[id].Start();
        }
    
  3. 実行順序は、次のようになりました。
    乱数を使っているので、毎回実行の順序が変わるので、念のため。
    ID:2  i:0  Time:07:33:43.6852960
    ID:0  i:0  Time:07:33:43.6852960
    ID:1  i:0  Time:07:33:43.6852960
    ID:0  i:1  Time:07:33:44.0440966
    ID:2  i:1  Time:07:33:44.0440966
    ID:1  i:1  Time:07:33:44.0440966
    ID:0  i:2  Time:07:33:44.4808974
    ID:1  i:2  Time:07:33:44.4808974
    ID:2  i:2  Time:07:33:44.4808974
    ID:0  i:3  Time:07:33:44.7304978
    ID:2  i:3  Time:07:33:44.7304978
    ID:1  i:3  Time:07:33:44.7304978
    

Join で終了を待ち合わせる

  1. スレッドの終了を待ち合わせるときは Join を使います。
    今回のプログラムでは、Join で終了を待ち合わせる必要はありません。
        static void Main()
        {
            const int N = 3;        // 同時に実行するスレッド数
            Thread[] threads = new Thread[N];
    
            for(int id=0; id<N; ++id)
            {
                NowTime nowtime = new NowTime(id);
                threads[id] = new Thread(new ThreadStart(nowtime.Run));
                threads[id].Start();
            }
            for(int id=0; id<N; ++id)
            {
                threads[id].Join();
                Console.WriteLine("ID:{0} が終了しました", id);
            }
            Console.ReadLine();
        }
    
  2. 実行結果は、次のようになりました。
    ID:2  i:0  Time:07:56:32.0820507
    ID:1  i:0  Time:07:56:32.0820507
    ID:0  i:0  Time:07:56:32.0820507
    ID:0  i:1  Time:07:56:32.5968516
    ID:1  i:1  Time:07:56:32.5968516
    ID:2  i:1  Time:07:56:32.5968516
    ID:2  i:2  Time:07:56:32.8308520
    ID:1  i:2  Time:07:56:32.8308520
    ID:0  i:2  Time:07:56:32.8308520
    ID:1  i:3  Time:07:56:33.5016532
    ID:0  i:3  Time:07:56:33.5016532
    ID:0 が終了しました
    ID:1 が終了しました
    ID:2  i:3  Time:07:56:33.5016532
    ID:2 が終了しました
    

[Next Chapter ↓] スレッドの中断
[Previous Chapter ↑] スレッドを起動

超初心者のプログラム入門(C# Frame Work)