Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C#

C#のスレッド(Thread)とは?概要やサンプルプログラムをご紹介

投稿日:2021年6月23日 更新日:

 

<目次>

(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」メソッドが実行された
・「Wait」メソッドが実行された

終了 以下のような状況下の状態です。

・処理完了した
・異常終了した

目次にもどる

(1-1-2) mainスレッドについて

C#では「System.Threading.Thread」クラスを用いてスレッドを生成したり、操作したりする事ができます。プロセスの中で最初に呼ばれるスレッドを「main」スレッドと呼びます。「main」スレッドはC#のプログラムの実行開始と同時に生成され、そこから派生して「子スレッド」を生成する事ができます。

(例)main文等で「Thread.CurrentThread」を使って取得できるスレッドが「main」スレッドです。
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のオブジェクトを生成しますが、構文②のように「ThreadStart」のコンストラクタを持ちいて初期化する事も可能です。
 
スレッドの実行は次のようにThreadクラスの「Start()」メソッドを実行します。
 
(構文:スレッド実行)
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)実行結果

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C#

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ASP.NET MVCのルーティングの基本

<目次> (1) ASP.NET MVCのルーティングの基本  (1-1) 構文  (1-2) サンプルプログラム   ・RouteConfig.cs   ・Controller   ・View  ( …

Xamarin.FormsでHelloworldする手順+Buttonコントロール追加のサンプルコード紹介

<目次> (1) Xamarin.FormsでHelloworldする手順  (1-1) Xamarin.Formsプロジェクト構成の概要  (1-2) MainPage.xamlの修正  (1-3) …

ASP.NET MVCのRouteConfigを追加する方法を2つご紹介

  <目次> (1) ASP.NET MVCのRouteConfigを追加する方法を2つご紹介  (1-1) やりたい事の整理  (1-2) 方法1:通常のルーティング  (1-3) 方法2 …

BundleConfig.csの設定および記述方法について

  <目次> (1) BundleConfig.csの設定および記述方法について  (1-1) BundleConfig.csの設定および記述方法について  (1-2) BundleConf …

ASP.NETのViewBagとは?構文やサンプルプログラムもご紹介

  <目次> (1) ASP.NETのViewBagとは?構文やサンプルプログラムもご紹介  (1-1) 概要  (1-2) 構文  (1-3) サンプルプログラム (1) ASP.NETの …

  • English (United States)
  • 日本語
Top