ThreadPoolの使い方
hreadPoolの使い方
// ThreadMethodをスレッドプールで実行できるように // WaitCallbackデリゲートを作成 WaitCallback waitCallback = new WaitCallback(ThreadMethod); // スレッドプールに登録 ThreadPool.QueueUserWorkItem(waitCallback, "A"); ThreadPool.QueueUserWorkItem(waitCallback, "B");
連載.NETマルチスレッド・プログラミング入門:第2回 .NETにおけるマルチスレッドの実装方法を総括 (3/4) - @IT
ThreadPool.QueueUserWorkItemメソッド(静的メソッド)を実行すると、
スレッドプールのキューにThreadMethodメソッドの実行指令が登録されることになる。
後は、スレッドプール内のスレッドが自動的にスケジューリングされ、
登録された実行指令が次々と実行されていく。
ThreadPool.QueueUserWorkItemメソッドの第2パラメータには、
object型のパラメータを指定することができる。
このパラメータについての型チェックなどは行われないが、
これを利用することによって、スレッドプールにより実行されるメソッドにパラメータを渡すことができる。
今回のサンプルでは、“A”と“B”という文字列を渡している。
ThreadPoolクラスを使って同時に実行できるスレッドの最大数は、
1つのプロセス当たり「プロセッサ数×25」と決められており、
同時に実行できるスレッドの残りの数は
ThreadPool.GetAvailableThreadsメソッドで取得できる。
using System; using System.Threading; public class List2 { public static void Main() { // ThreadMethodをスレッドプールで実行できるように // WaitCallbackデリゲートを作成 WaitCallback waitCallback = new WaitCallback(ThreadMethod); // (1) // スレッドプールに登録 ThreadPool.QueueUserWorkItem(waitCallback, "A"); // (2) ThreadPool.QueueUserWorkItem(waitCallback, "B"); // (3) //何かキーが押されるまで、プログラムを実行 Console.ReadLine(); } // 別スレッドで動作させるメソッド private static void ThreadMethod(object state) // (4) { for (int i = 0; i < 100; i++) { Thread.Sleep(5); Console.Write(" {0} ", state); } } }