C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のThreadクラス入門:Join・Sleep・Abortメソッドの使い方を徹底解説

C#でマルチスレッドプログラミングを行う際、System.Threading名前空間のThreadクラスが提供するJoinSleepAbortの各メソッドは、スレッドの動作を制御するための基本的な機能です。本記事では、それぞれのメソッドの役割と実際のコード例を通じて、その使い方を詳しく解説します。

Joinメソッドとは

Joinメソッドは、呼び出し元のスレッドをブロックし、対象のスレッドが終了するまで待機させます。待機中も標準的なCOMおよびSendMessageのポンプ処理は継続して実行されるため、UIスレッドなどでも安全に利用できます。また、このメソッドには複数のオーバーロードが用意されており、タイムアウト時間を指定して待機することも可能です。

Sleepメソッドとは

Sleepメソッドは、現在実行中のスレッドを指定したミリ秒間だけ一時停止させます。処理の間隔を調整したい場合や、他のスレッドにCPUリソースを譲りたい場合などに活用されます。

Abortメソッドとは

Abortメソッドは、実行中のスレッドを強制的に破棄(終了)するために使用されます。呼び出されると、対象のスレッド内でThreadAbortExceptionが発生し、その例外をキャッチすることで終了処理を制御できます。

注意: Thread.Abortは.NET Frameworkでは利用できますが、.NET Core以降(.NET 5以降を含む)ではサポートされておらず、呼び出すとPlatformNotSupportedExceptionがスローされます。モダンな.NET環境では、CancellationTokenなどによる協調的なキャンセル処理が推奨されています。

Join()の使用例

以下は、Join()を使ってメインスレッドが子スレッドの完了を待機する例です。

using System;
using System.Diagnostics;
using System.Threading;

namespace Sample {
    class Demo {
        static void Run() {
            for (int i = 0; i < 2; i++)
                Console.Write("Sample text!");
        }

        static void Main(string[] args) {
            Thread t = new Thread(Run);
            t.Start();
            t.Join(); // 子スレッドの終了を待機
            Console.WriteLine("Thread terminated!");
            Console.Read();
        }
    }
}

このコードでは、t.Join()によってメインスレッドが子スレッドの処理完了まで待つため、「Sample text!Sample text!」が出力された後に「Thread terminated!」と表示されます。Joinがない場合、出力順序は実行タイミングによって変わる可能性があります。

Abort()とSleep()の使用例

次に、Abort()Sleep()を組み合わせた例を見てみましょう。

using System;
using System.Threading;

namespace Demo {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            try {
                Console.WriteLine("Child thread starts");
                // 0から10までカウントする処理
                for (int counter = 0; counter <= 10; counter++) {
                    Thread.Sleep(500); // 500ミリ秒ごとに一時停止
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");
            } catch (ThreadAbortException e) {
                Console.WriteLine("Thread Abort Exception");
            } finally {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }
        }

        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();

            // メインスレッドを2秒間停止
            Thread.Sleep(2000);

            // 子スレッドを中断
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}

この例では、子スレッドが0.5秒間隔でカウントアップを行っている最後に、メインスレッドが2秒待機した後でAbort()を呼び出します。すると子スレッド内でThreadAbortExceptionが発生し、catchブロックとfinallyブロックの処理が実行されてからスレッドが終了します。

まとめ

  • Join:指定したスレッドの終了を待機する
  • Sleep:現在のスレッドを一定時間停止させる
  • Abort:スレッドを強制終了する(.NET Core以降では非対応)

これらのメソッドを適切に使い分けることで、マルチスレッドアプリケーションのスレッド制御を柔軟に行えます。ただし、新しい.NET環境ではAbortに代わるCancellationTokenTaskベースの非同期処理の採用を検討しましょう。

  1. AndroidでThread.sleep()を使用する方法を徹底解説!基本の仕組みと実装手順

    スレッド(Thread)とは? 実装例に入る前に、まずスレッドについて理解しておきましょう。スレッドとは軽量なサブプロセスのことで、UIの動作を妨げることなくバックグラウンド処理を実行するために使用されます。 本記事では、AndroidアプリでThread.sleep()を使って処理を一時停止させる方法を、具体的なサンプルコードとともにわかりやすく解説します。 手順1:新規プロジェクトを作成する Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。 手順2:レイアウ

  2. Pythonのthreadingモジュールで学ぶスレッドベースの並列処理

    スレッドとは何か コンピュータサイエンスにおけるスレッド(Thread)とは、オペレーティングシステム(OS)の一部であるスケジューラによって独立して管理できる、一連の命令(処理の手順)のことです。 スレッディングの主な役割は、複数のスレッドを同時に実行することです。ここでいうスレッドとは、プログラム内の個々のタスクや関数呼び出しを指します。複数のスレッドが同時に動作するといっても、それは別々のマシン上で実行されるという意味ではなく、同じプロセス内で並行して処理が進むことを意味します。 マルチスレッディングが活用される主なケース サブプログラムの出力結果を、メインプログラムの結果と統合する