Thread②
スレッドの基本②
ThreadStatic/ThreadLocal
以下2つの方法で、アクセスするスレッド毎にフィールド/変数に異なる値を持つことができます。
- staticフィールドに対してThreadStatic属性を付与する
[TheadStatic] private static int hoge;
- ThreadLocal
型のフィールド/変数として宣言する
private ThreadLocalhoge;
ThreadStaticはstaticフィールドにのみ使用可能です。
ThreadLocalはローカル変数でも使用可能です。
スレッドプール
スレッドを作成するということは、電車を走らせるために線路もセットで作るようなものです。
これは非常にコストがかかります。
スレッドプールは予めいくつかのスレッドを準備しておき、各処理で使い回す仕組みです。
スレッドプール管理下のスレッドに処理を登録する方法は以下のようなものがあります。
- ThreadPool.QueueUserWorkItem()を使用する。
ThreadPool.QueueUserWorkItem(() => hoge());
- Taskを使用する。
スレッドプールは便利ですが、以下のような制約があります。
- 管理するスレッド数は上限があります。
大量のスレッドを必要とする処理や、スレッドを長時間専有する処理は不向きです。
前者は実行しきれない処理が、後者はスレッドプールを利用する他処理が待機状態になってしまいます。 - スレッドはすべてバックグラウンドプロセスです。
優先度の変更もできません。
etc...