次の記事では、C# スレッドの概要を説明します。プログラムの実行パスはスレッドとして定義され、スレッドごとに固有の制御フローが定義されます。アプリケーションが複雑で時間のかかる操作で構成されている場合、各スレッドが特定のジョブを担当するように、異なる実行パスまたはスレッドを設定する必要があります。これらのスレッド処理は軽量であり、並行プログラミングを実装する最新のオペレーティング システムは、スレッドの使用例の 1 つであり、スレッドを使用することにより、中央処理装置のサイクルの無駄が節約され、アプリケーションの効率が向上します。
構文:
public sealed class Thread: System.Runtime.ConstrainedExecution.CriticalFinalizerObject
スレッドのライフサイクルが開始されるときに System.Threading.Thread クラスのオブジェクトが作成される時刻。スレッドの終了またはスレッドの実行完了があると、スレッドが作成され終了します。
スレッドのライフサイクルにはいくつかの状態があります。
1.未開始状態: この状態は、start メソッドが呼び出されず、スレッドのインスタンスが作成されたときの状況です。
2. Ready 状態: この状態は、スレッドが実行するようにすべて設定され、中央処理装置のサイクルを待っている状態です。
3.実行不可能な状態: この状態は、次の場合にスレッドを実行できない状況です。
4.デッド状態: この状態は、スレッドの実行が完了したか、スレッドの実行が中止されたときの状況です。
以下のプログラムはメインスレッドの実行を示しています:
コード:
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(); } } }
出力:
上記のプログラムでは、マルチスレッドと呼ばれる名前空間が作成されます。次に、mainthread という名前のクラスがマルチスレッド名前空間の下に作成されます。次に、main メソッドが呼び出されます。次に、スレッド クラスのインスタンスが作成されます。次に、スレッド クラスのインスタンスを使用して、スレッド クラスの Name メソッドにアクセスします。最後に、出力が画面に表示されます。
スレッド クラスのいくつかのメソッドを以下に示します:
スレッド上で 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(); } }
出力:
Interrupt() メソッドが呼び出されるたびに、WaitSleepJoin のスレッド状態にあるスレッドは中断されます。
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(); } }
出力:
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"); } }
出力:
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"); } }
出力:
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(); } } }
出力:
Whenever Suspend() method is called, the current thread is suspended if it is not suspended.
Whenever Resume() method is called, the suspended thread is resumed.
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# スレッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。