一定量のスレッドを準備しておき、キューに登録したワークアイテム(実行したい処理(タスク))にそれぞれ割り当てて、終わった後も再び使いまわせるような仕組みをスレッドプールという・・・。
ThreadPoolは、そのスレッドプールを扱うクラス・・・。
ThreadPool クラス (System.Threading)
Mainでのループ処理に加えて、スレッドプールにThreadFuncのタスクを3つ割り当てる・・・。
まず、WaitCallbackデリゲート(これはSystem.Threading名前空間に用意されている既定もの)のwaitCallbackにThreadFuncを登録・・・。
ThreadFuncは、
前回までと似ているが、引数にobject型stateがある部分だけ違う・・・。
これは、WaitCallbackデリゲートの引数型がそうなっているから・・・。
WaitCallback デリゲート (System.Threading)
今回はstateは使わない・・・。
ThreadPool.QueueUserWorkItemでwaitCallbackを3回登録・・・。
これでスレッドプールで3つ並行してループ処理が走ることになる・・・。
さらに、メイン側もループを用意・・・。
なのでメインスレッドとスレッドプールを合わせると4つ並行・・・。
メインスレッドが先に終わってしまうと、スレッドプールの残りの出力が出ない場合があるので、何かキーが押されるまで待つ・・・。
実行すると、
Main(1) ThreadFunc(1) ThreadFunc(2) Main(2) ThreadFunc(1) ThreadFunc(1) ThreadFunc(3) Main(3) ThreadFunc(2) ThreadFunc(2) ThreadFunc(4) Main(4) ThreadFunc(3) ThreadFunc(3) ThreadFunc(5) Main(5) ThreadFunc(4) ThreadFunc(4) ThreadFunc(5) ThreadFunc(5) 続行するには何かキーを押してください . . .
結果だけ見るとこうだが、実際に実行してみると、1秒ごとのタイミングじゃないタイミングで出力されたりする・・・。
そして、一気に進むやつと遅れるやつが出てくる・・・。
Sample/dotnet/ThreadPool/ThreadPool/src/ThreadPool_ at master · bg1bgst333/Sample · GitHub