<目次>
(1) C#のスレッド(Thread)とは?概要やサンプルプログラムをご紹介
(1-1) 概要
(1-1-1) スレッドのライフライクルについて
(1-1-2) mainスレッドについて
(1-2) 構文
(1-3) サンプルプログラム
(1-3-1) main文
(1-3-2) クラス1:スレッド生成・実行
(1-3-3) クラス2:スレッドで実行する処理
(1) C#のスレッド(Thread)とは?概要やサンプルプログラムをご紹介
(1-1) 概要
Threadは教科書的には「プログラムを実行する際に辿る経路(1つの連続した処理の流れ)」の事です。通常(スレッドを使わない場合)は、1つのスレッドが1つのプロセスとして実行されていますが、複数のスレッドを使う事で、複数の処理を同時並行で実行する事ができ、より効率的な処理を行う事が可能になります。
(1-1-1) スレッドのライフライクルについて
スレッドのライフライクルは「System.Threading.Thread」のオブジェクトが生成されたタイミングで「開始」し、タスクが終了するor強制終了させられたタイミングで「終了」します。
●状態 | ●説明 |
未開始 | スレッドのインスタンスは生成されたものの、Startメソッドが呼ばれていない状態。 |
準備完了 | スレッドのインスタンスは生成されて実行可能&CPU待ちの状態。 |
実行不可 | 以下のような状況下の状態です。
・「Sleep」メソッドが実行された |
終了 | 以下のような状況下の状態です。
・処理完了した |
(1-1-2) mainスレッドについて
C#では「System.Threading.Thread」クラスを用いてスレッドを生成したり、操作したりする事ができます。プロセスの中で最初に呼ばれるスレッドを「main」スレッドと呼びます。「main」スレッドはC#のプログラムの実行開始と同時に生成され、そこから派生して「子スレッド」を生成する事ができます。
class ThreadTest { static void Main(string[] args) { Thread th = Thread.CurrentThread; th.Name = "MAIN THREAD"; Console.WriteLine("# Thread name : {0}", th.Name); } }
(図111)mainスレッドのイメージ
(1-2) 構文
まずはusingディレクティブで「System.Threading;」名前空間のインポートを行った上で、Threadクラスのオブジェクトを生成してスレッドを生成します。
(構文:スレッド生成)
//# 構文① Thread thr = new Thread([実行メソッド]); //# 構文② Thread thr = new Thread(new ThreadStart([実行メソッド]));
Thread thr = new Thread([実行メソッド]); thr.Start();
この「Thread」クラスを複数生成してStart()で実行する事で、複数のスレッドによる並列処理になります(マルチスレッド)。
(1-3) サンプルプログラム
(1-3-1) main文
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestProject { class Home { static void Main(string[] args) { ThreadExecute th = new ThreadExecute(); th.ExecThreadTest(); } } }
(1-3-2) クラス1:スレッド生成・実行
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace TestProject { public class ThreadExecute { public void ExecThreadTest() { //# テスト用クラスのオブジェクト生成 ThreadTest tt = new ThreadTest(); //# スレッド生成 Thread thr = new Thread(new ThreadStart(tt.sayHello)) ; thr.Start(); } } }
(1-3-2) クラス2:スレッドで実行する処理
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace TestProject { public class ThreadTest { public void sayHello() { Console.WriteLine("### スレッドにより実行されています"); } } }
(図131)実行結果