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

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

関連記事

C#のデリゲートが分からない・・を解決!初心者向けになるべく分かり易く説明してみた

<目次> (1) C#のデリゲートが分からない・・を解決!初心者向けになるべく分かり易く説明してみた  (1-1) デリゲートとは?「関数へのポインタ」だけでは説明しきれない・・  (1-2) デリゲ …

Xamarin.Formsのプロジェクトを新規作成する手順

<目次> (1) Xamarin.Formsのプロジェクトを新規作成する手順  (1-1) Xamarin.Formsプロジェクトの作成   (1-1-1) プロジェクト新規作成   (1-1-2) …

VisualStudioで文字列の検索をソリューション内やプロジェクト内で行う方法

<目次> (1) VisualStudioで文字列の検索をソリューション内やプロジェクト内で行う方法  (1-1) 検索方法   (1-1-1) 「検索と置換」画面を開く   (1-1-2) 検索条件 …

C#のエラー「CS1069~このアセンブリへの参照を追加する事を検討してください」の対処方法+実際のソース例も掲載

<目次> (1) C#のエラー「CS1069~このアセンブリへの参照を追加する事を検討してください」の対処方法  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 (1 …

C#でフォルダ内のファイルの一覧を取得する方法

<目次> (1) C#でフォルダ内のファイルの一覧を取得する方法  (1-1) 方法①構文  (1-2) 方法①サンプルプログラム  (1-3) 方法②構文  (1-4) 方法②サンプルプログラム ( …

  • English (United States)
  • 日本語
Top