ホームページ  >  記事  >  バックエンド開発  >  C# スレッド

C# スレッド

王林
王林オリジナル
2024-09-03 15:25:25399ブラウズ

次の記事では、C# スレッドの概要を説明します。プログラムの実行パスはスレッドとして定義され、スレッドごとに固有の制御フローが定義されます。アプリケーションが複雑で時間のかかる操作で構成されている場合、各スレッドが特定のジョブを担当するように、異なる実行パスまたはスレッドを設定する必要があります。これらのスレッド処理は軽量であり、並行プログラミングを実装する最新のオペレーティング システムは、スレッドの使用例の 1 つであり、スレッドを使用することにより、中央処理装置のサイクルの無駄が節約され、アプリケーションの効率が向上します。

構文:

public sealed class Thread: System.Runtime.ConstrainedExecution.CriticalFinalizerObject

C# スレッド クラスの動作

スレッドのライフサイクルが開始されるときに System.Threading.Thread クラスのオブジェクトが作成される時刻。スレッドの終了またはスレッドの実行完了があると、スレッドが作成され終了します。

スレッドのライフサイクルにはいくつかの状態があります。

1.未開始状態: この状態は、start メソッドが呼び出されず、スレッドのインスタンスが作成されたときの状況です。

2. Ready 状態: この状態は、スレッドが実行するようにすべて設定され、中央処理装置のサイクルを待っている状態です。

3.実行不可能な状態: この状態は、次の場合にスレッドを実行できない状況です。

  • Sleep メソッドへの呼び出しがありました。
  • Wait メソッドへの呼び出しがありました。
  • 入出力操作によりブロックが発生しました。

4.デッド状態: この状態は、スレッドの実行が完了したか、スレッドの実行が中止されたときの状況です。

  • C# でスレッドを操作するには、System.Threading.Thread クラスを使用する必要があります。
  • マルチスレッドのアプリケーションを操作しているときに、C# の System.Threading.Thread クラスを使用して個別のスレッドを作成し、アクセスできます。
  • プロセス全体で最初に実行されるスレッドをメインスレッドと呼びます。
  • メインスレッドは、C# プログラムの実行が開始されると自動的に作成されます。
  • Thread のクラスを使用して作成されたスレッドは、メインスレッドの子スレッドとして呼び出されます。
  • Thread クラスの CurrentThread プロパティは、スレッドにアクセスするために使用されます。

以下のプログラムはメインスレッドの実行を示しています:

コード:

using System;
using System.Threading;
//a namespace called multithreading is created
namespace Multithreading
{
//a class called mainthread is created under multithreading namespace
class MainThread
{
//main method is called
static void Main(string[] args)
{
//an instance of the thread class is created
Thread thr = Thread.CurrentThread;
//Name method of thread class is accessed using the instance of the thread class
thr.Name = "Thread Class";
//the content is displayed as the output
Console.WriteLine("Welcome to {0}", thr.Name);
Console.ReadKey();
}
}
}

出力:

C# スレッド

上記のプログラムでは、マルチスレッドと呼ばれる名前空間が作成されます。次に、mainthread という名前のクラスがマルチスレッド名前空間の下に作成されます。次に、main メソッドが呼び出されます。次に、スレッド クラスのインスタンスが作成されます。次に、スレッド クラスのインスタンスを使用して、スレッド クラスの Name メソッドにアクセスします。最後に、出力が画面に表示されます。

スレッドクラスのメソッド

スレッド クラスのいくつかのメソッドを以下に示します:

1.中止()

スレッド上で Abort() メソッドが呼び出されるたびに、ThreadAbortException が発生し、スレッドの終了プロセスが開始されます。スレッドの終了は、このメソッドの呼び出しによって引き起こされます。

例:

コード:

using System;
using System.Threading;
class ExThread
{
public void thr()
{
for (int y = 0; y < 3; y++)
{
Console.WriteLine(y);
}
}
}
class Example
{
public static void Main()
{
ExThread ob = new ExThread();
Thread th = new Thread(new ThreadStart(ob.thr));
th.Start();
Console.WriteLine("Aborting the thread");
th.Abort();
}
}

出力:

C# スレッド

2.割り込み()

Interrupt() メソッドが呼び出されるたびに、WaitSleepJoin のスレッド状態にあるスレッドは中断されます。

3.参加()

Join() メソッドが呼び出されるたびに、スレッドが終了するまで呼び出しスレッドはブロックされ、スレッドのブロックとともに標準の COM および SendMessage ポンピングが引き続き実行されます。

Interrupt() と Join() を実装する例:

コード:

using System;
using System.Threading;
class Thr
{
Thread th;
public Thr(String name1)
{
th = new Thread(this.Runaway);
th.Name = name1;
th.Start();
}
public void Runaway()
{
Thread th1 = Thread.CurrentThread;
try
{
Console.WriteLine(" Execution of " + th1.Name + " has begun");
for(int y=0; y<3; y++)
{
Console.WriteLine(" Printing of " + th1.Name + " has begun" + y);
Thread.Sleep(200);
}
Console.WriteLine(" Execution of " + th1.Name + " is finished");
}
catch(ThreadInterruptedException e)
{
Console.WriteLine("Thread Interruption" + e);
}
}
public static void Main(String[] ar)
{
Thr ob = new Thr("Thread demo");
ob.th.Interrupt();
ob.th.Join();
}
}

出力:

C# スレッド

4. ResetAbort()

ResetAbort() メソッドが呼び出されるたびに、現在のスレッドの終了要求はキャンセルされます。

例:

コード:

using System;
using System.Threading;
using System.Security.Permissions;
class Thread1
{
public void Jobthread()
{
try
{
for (int r = 0; r < 3; r++)
{
Console.WriteLine(" Working of thread has begun ");
Thread.Sleep(10);
}
}
catch (ThreadAbortException e)
{
Console.WriteLine("ThreadAbortException is caught and must be reset");
Console.WriteLine("The message looks like this: {0}", e.Message);
Thread.ResetAbort();
}
Console.WriteLine("Thread is working fine");
Thread.Sleep(200);
Console.WriteLine("Thread is done");
}
}
class Driver
{
public static void Main()
{
Thread1 obj = new Thread1();
Thread Th = new Thread(obj.Jobthread);
Th.Start();
Thread.Sleep(100);
Console.WriteLine("thread abort");
Th.Abort();
Th.Join();
Console.WriteLine("end of main thread");
}
}

出力:

C# スレッド

5.開始()

Start() メソッドが呼び出されるたびに、スレッドが開始されます。

例:

コード:

using System;
using System.Threading;
class Test
{
static void Main()
{
Thread td = new Thread (new ThreadStart (Got));
td.Start();
}
static void Got()
{
Console.WriteLine ("this is thread Start() method");
}
}

出力:

C# スレッド

6.スリープ(int ミリ秒タイムアウト)

Sleep(int millisecondsTimeout) メソッドが呼び出されるたびに、スレッドは指定された期間一時停止されます。

例:

コード:

using System;
using System.Threading;
namespace Examplethr
{
class MyThread
{
static void Main(string[] args)
{
Thread th = Thread.CurrentThread;
th.Name = "This is the First Thread";
Console.WriteLine("The Name of the thread is : {0}", th.Name);
Console.WriteLine("The priority of the thread is : {0}", th.Priority);
Console.WriteLine("Pausing the child thread");
// using Sleep() method
Thread.Sleep(100);
Console.WriteLine("Resuming the child thread");
Console.ReadKey();
}
}
}

出力:

C# スレッド

7. Suspend()

Whenever Suspend() method is called, the current thread is suspended if it is not suspended.

8. Resume()

Whenever Resume() method is called, the suspended thread is resumed.

9. Yield()

Whenever Yield() method is called, the calling thread must result in execution to the other thread which is ready to start running on the current processor. The thread to yield to is selected by the operating system.

Example to implement Suspend() Resume() and Yield()

Code:

using System;
using System.Runtime.CompilerServices;
using System.Threading;
class Program
{
public static void Main ()
{
bool finish = false;
Thread th = new Thread (() => {
while (!finish) {}
});
Thread th1 = new Thread (() => {
while (!finish) {
GC.Collect ();
Thread.Yield ();
}
});
th.Start ();
th1.Start ();
Thread.Sleep (10);
for (int j = 0; j < 5 * 4 * 2; ++j) {
th.Suspend ();
Thread.Yield ();
th.Resume ();
if ((j + 1) % (5) == 0)
Console.Write ("Hello ");
if ((j + 1) % (5 * 4) == 0)
Console.WriteLine ();
}
finish = true;
th.Join ();
th1.Join ();
}
}

Output:

C# スレッド

以上がC# スレッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。