読者です 読者をやめる 読者になる 読者になる

ThreadPool

定量のスレッドを準備しておき、キューに登録したワークアイテム(実行したい処理(タスク))にそれぞれ割り当てて、終わった後も再び使いまわせるような仕組みをスレッドプールという・・・。

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