スレッドを起動

B:  i:0  Time:06:38:55.3995564
A:  i:0  Time:06:38:55.3995564
A:  i:1  Time:06:38:55.6335568
B:  i:1  Time:06:38:55.6335568
B:  i:2  Time:06:38:56.1951578
A:  i:2  Time:06:38:56.1951578
B:  i:3  Time:06:38:56.8191589
A:  i:3  Time:06:38:56.8191589

スレッドの説明と、基本プログラムです。

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

プログラムの説明

  1. スレッドとはプロセスの実行単位で、通常のプログラムは1プロセス(シングルスレッド)で実行されます。
    昔は処理に時間がかかる「入出力処理」をチャネルに任せて、CPU の空き時間を有効に活用するマルチプログミングなどが行われていました。
    最近ではパソコンの CPU も高性能になり、複数の CPU(処理装置)を積み込んだチップも一般的になりました。
    私が現在使っているパソコンは4台の CPU で構成されています。
    そうなると、4プロセス(4スレッド)が同時に実行出来ることになります。
    スレッドを意識しなくても、画像やファイルの入出力で「同時進行している」と思われる現象に出くわすことがあり注意が必要です。
  2. スレッドで実行されたことを確かめるために、ランダムな間隔を置いて、時刻を表示するメソッドを定義しました。
    /*************************************************/
    /*★ ランダムな時間間隔で時刻を出力    前田 稔 ★*/
    /*************************************************/
    
    using System;
    using System.Threading;
    
    class myclass
    {
        static void Main()
        {
            RunA();
            RunB();
        }
    
        // ランダムな時間間隔で時刻を出力
        // Thread 起動は void 型でパラメータ無し
        static void RunA()
        {
            Random rnd = new Random();
    
            for(int i=0; i<4; ++i)
            {
                Thread.Sleep(rnd.Next(100, 700));   //100 ~ 699 秒中断
                Console.WriteLine("A:  i:{0}  Time:{1}",i,DateTime.Now.TimeOfDay.ToString());
            }
        }
    
        // ランダムな時間間隔で時刻を出力
        static void RunB()
        {
            Random rnd = new Random();
    
            for(int i=0; i<4; ++i)
            {
                Thread.Sleep(rnd.Next(100, 700));   //100 ~ 699 秒中断
                Console.WriteLine("B:  i:{0}  Time:{1}",i,DateTime.Now.TimeOfDay.ToString());
            }
        }
    }
    
  3. RunA() と RunB() は同様のメソッドですが、印字の先頭が A: と B: で始まります。
    このメソッドは Thread で起動する予定なので、void 型のパラメータ無しで定義します。
  4. Main() では RunA(); に続いて RunB(); を呼び出します。
    当然ながら RunA() が終了してから RunB() が起動されるので、実行順序は次のようになります。
    A:  i:0  Time:10:46:46.7097542
    A:  i:1  Time:10:46:47.2713552
    A:  i:2  Time:10:46:47.6925559
    A:  i:3  Time:10:46:48.3633571
    B:  i:0  Time:10:46:48.5817575
    B:  i:1  Time:10:46:48.8469580
    B:  i:2  Time:10:46:49.2369586
    B:  i:3  Time:10:46:49.8141597
    

スレッドで起動

  1. それでは Main() からスレッドで起動してみましょう。
    new Thread(new ThreadStart(RunA)); でインスタンス化して、thread.Start(); で起動します。
    RunA はスレッドで起動する void 型のパラメータ無しのメソッドです。
    続いて RunB(); をスレッドを使わずに普通の関数として呼び出します。
        static void Main()
        {
            Thread thread = new Thread(new ThreadStart(RunA));
            thread.Start();
            RunB();
        }
    
  2. RunA() と RunB() 実行順序は、次のようになりました。
    RunA() と RunB() が同時に実行されていることが解るでしょう。
    乱数を使っているので、毎回実行の順序が変わるので、念のため。
    B:  i:0  Time:06:38:55.3995564
    A:  i:0  Time:06:38:55.3995564
    A:  i:1  Time:06:38:55.6335568
    B:  i:1  Time:06:38:55.6335568
    B:  i:2  Time:06:38:56.1951578
    A:  i:2  Time:06:38:56.1951578
    B:  i:3  Time:06:38:56.8191589
    A:  i:3  Time:06:38:56.8191589
    
  3. Windows Mode のスレッドは Windows Thread を参照して下さい。
    よく似た機能に Task があります。
    Task の例はC++の Task を起動 を参照して下さい。

[Next Chapter ↓] Thread NowTime Class

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