この記事は
.NET並行処理プログラミング入門2の続きです。前回はスレッドの生成方法および実行方法を解説しました。今回はスレッドの種類と複数のスレッドの実行について解説します。
前回のサンプルは並行処理をしている実感が得られなかったと思います。そこで、今回は2つのスレッドを実行するサンプルを掲載し、スレッドオブジェクトについての解説を進めます。
using System;
using System.Threading;
class ThreadSample
{
static void Main( string[] args )
{
//カウントスレッドを用意
ThreadStart start = new ThreadStart( Piyo.Count );
Thread counter = new Thread( start );
//ピヨスレッドを用意
Piyo p = new Piyo();
ThreadStart piyoStart = new ThreadStart( p.PiyoOut );
Thread piyopiyo = new Thread( piyoStart );
piyopiyo.IsBackground = true;
//二つのスレッドを実行
counter.Start();
piyopiyo.Start();
}
}
class Piyo
{
public Piyo() { }
public void PiyoOut()
{
while( true ) {
Console.WriteLine(" ピヨ ");
}
}
public static void Count()
{
Console.WriteLine( "数えるピヨ♪" );
for ( long i = 0; i < 1000; ++i ) {
Console.Write( "{0} ", i );
}
Console.WriteLine();
}
}
このサンプルは一見すると、ピヨスレッドの処理が終わらないので、永遠に処理が続くように見えます。しかし、実際はちゃんと終了します。その理由は、
バックグラウンドスレッドが他の種類のスレッドに強制終了させられるからです。
非並行処理の.NETのプログラムが動いているのは、
メインスレッドが動作しているからです。そして、サンプルのカウントスレッドのような
フォアグラウンドスレッドが動いている間プログラムは終了しません。フォアグラウンドスレッドは、全ての処理が終了すると、全てのバックグラウンドスレッドを停止しプログラムを終了させます。
フォアグラウンドスレッドとバックグラウンドスレッドの違いは重要なので絶対に覚えて下さい。どういう観点で使い分けるのかの目安を言います。バックグラウンドスレッドは途中で終了しても支障がないサブ処理で使用します。一方、フォアグラウンドスレッドは、途中で終了すると不都合がある処理で使用します。
注意:これはあくまでも目安なので、実務で使用する前にこの連載の続きやMSDNをよく読んで下さい。
バックグラウンドスレッドは、処理の途中で強制的に終了させられるので十分に注意して使用して下さい。バックグラウンドスレッドで処理をする場合は、いきなり処理が終了させられる可能性があるので扱うデータの整合性を保てるように工夫しましょう。続く...
テーマ : プログラミング
ジャンル : コンピュータ