<目次>
(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)実行結果
