.NETでのマルチスレッドプログラミング [開発環境]
1. 種類
◆スレッド(Thread)
Threadクラス(System.Threading名前空間)は、指定したメソッドを別スレッドで起動(実行)する仕組みを提供する。スレッドの一時停止や中断、優先順位付けなどを細かく制御することもできる。
ただし、サーバ型のプログラムのように、リクエストを並行して処理するようなプログラムの場合、スレッドの生成・破棄を大量に繰り返す必要が出てくる。スレッドの生成にはそれなりのリソースが消費されるため、単純にこれを繰り返していてはパフォーマンスが低下する。
メリット
・ 各スレッドに優先順位を設定できる
・ スレッドの一時停止/再開/中断を行うことができる
デメリット
・ スレッドの作成と破棄を繰り返すとパフォーマンスが落ちる
・ メソッドにパラメータを設定できない
・ メソッドの戻り値を得るのが困難
◆スレッドプール(ThreadPool)
スレッドプールとは、キューに入れられたリクエスト(処理)をスレッドプールが用意しているスレッドにより次々に実行していく仕組みである。
スレッドプールでは、一度確保したスレッドのリソースをできる限り再利用するように設計されている。そのため、別スレッドで実行したいメソッドを、スレッドプール専用のキューに次々と入れる(登録する)だけで、後は自動的に登録したメソッドが別スレッドで効率よく実行されていく。
メリット
・ 効率よく複数のスレッドを実行できる
・ object型のパラメータを1つだけ設定できる
デメリット
・ パラメータがobject型1つのみ
・ メソッドの戻り値を得るのが困難
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆デリゲート(BeginInvoke)
内部的には先のスレッドプールを利用している。しかし、デリゲートによるメソッドの呼び出しは、通常のメソッドの呼び出しと同様にパラメータや戻り値を持つことができる。
デリゲートは「メソッドの呼び出しをラッピングしたもの(包んだもの)」と理解してよい。メソッドをデリゲートでラッピングすると、デリゲートに登録したメソッドを、デリゲートを通じて間接的に呼び出すことができる。これは「メソッド呼び出しの仮想化」と呼ばれる。
複数のメソッドを1つのデリゲートに登録して一度に呼び出したり、登録したメソッドを動的に入れ替えたりすることができ、デリゲートはアプリケーションの設計上極めて便利に働く。
デリゲートに登録されたメソッドを実行するには、普通に実行するInvokeメソッドのほかに、別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる(これらのメソッドはデリゲート・オブジェクトが持つメソッドである)。BeginInvokeメソッドを使用する場合には、デリゲートは上述したスレッドプールを利用して、登録されたメソッドを実行するという仕組みになっている。
メリット
・ メソッドに型のあるパラメータを指定できる
・ 簡単に戻り値を得ることができる
デメリット
・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい
・ 同時に実行できるスレッドの数が制限されている
◆タイマー(Timer)
一定期間ごとにスレッドを呼び出して、指定した処理を実行させる特殊なマルチスレッドの実現方法として、「タイマー」(Timerクラス)という方法
メリット
・一定時間間隔でメソッドを実行することができる
デメリット
・スレッドプールがいっぱいだとうまく動作しない
2. Threadクラスによるマルチスレッド
Imports System
Imports System.ThreadingPublic Class List1_1
Public Shared Sub Main()
Dim threadA As New Thread( _
New ThreadStart(AddressOf ThreadMethod)) ' (1)threadA.Start() ' (2)
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" B ")
Next i
End Sub' 別スレッドで動作させるメソッド
Private Shared Sub ThreadMethod()
For i As Integer = 0 To 99
Thread.Sleep(5)
Console.Write(" A ")
Next i
End SubEnd Class
参考サイト
コメント 0