プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 No.151-System.Threading.Thread(1)

2007/12/18

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━┳━┳━┓
┃☆┃ C#プログラミングレッスン                         ┃_┃□┃×┃
┣━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━┻━┻━┫
┃ System.Threading.Thread                                    No.151┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

皆さん、今年もあと残りわずかですね。
さて、すでにご存知の方も多いと思いますが、http://gushwell.ifdef.jp/
サイトで、当メールマガジンのバックナンバーがダウンロードできるようにな
っています。まだ、すべての記事がダウンロードできるわけではありませんが、
随時、掲載をしてゆく予定です。ご利用いただけると幸いです。


■──────────────────────────────────
■ System.Threading.Thread クラス

今までは、BackgroundWorker コンポーネントを使い、スレッド処理について
説明してきましたが、今回は、System.Threading.Thread クラスの説明です。

まずは、以下のコードをご覧ください。

using System;
using System.Threading;

class Program {
    static void Main(string[] args) {
        MyWorker worker1 = new MyWorker("Foo");
        worker1.Execute(150, ThreadPriority.Highest);
        MyWorker worker2 = new MyWorker("   Bar");
        worker2.Execute(150, ThreadPriority.Lowest);
        worker1.Join();
        Console.WriteLine("worker1 が終わりました。");
        worker2.Join();
        Console.WriteLine("worker2 が終わりました。");
        Console.ReadLine();
    }
}

class MyWorker {
    private Thread thread;
    private string _name;

    public MyWorker(string name) {
        thread = new Thread(DoWork);
        this._name = name;
    }

    public void Join() {
        thread.Join();
    }

    public void Execute(int n, ThreadPriority priority) {
        thread.Priority = priority;
        thread.Start(n);
    }

    private void DoWork(object param) {
        int count = (int)param;
        for (int i = 0; i < count; i++) {
            Console.Write(_name + i.ToString() + "\n");
            long n = 0;
            for (int j = 0; j < 70000; j++) {
                n += j;
            }
        }
    }
}

では、このプログラムの解説です。

●コンストラクタ

Threadのコンストラクタでは、どのメソッドをスレッドとして起動するのかを
指定します。

thread = new Thread(DoWork);

●Startメソッド

スレッドを起動するには、Startメソッドを呼び出します。
引数には、DoWorkメソッドに渡したい値を指定します。
ここでは、何回ループするかを指定しています。引数の型は Objectであるた
め、DoWork無いでは、int にキャストし、ループ回数を取り出しています。
Startメソッドを呼び出すと、インスタンスの状態が ThreadState.Running に
変更されます。

●Priorityプロパティ

スレッドのスケジューリング優先順位を指定します。値は、

 Highest 
 AboveNormal 
 Normal 
 BelowNormal 
 Lowest 

の5つで、上から順に優先順位が低くなります。この例では、Highest と
Lowestを指定しています。実行するPCの環境によっては、その差がわかりにく
いかもしれませんが、Executeメソッドの第1引数の値を大きくすることで、そ
の違いがわかるようになると思います。

●Joinメソッド
Joinメソッドは、スレッドが終了するまで、呼び出し元のスレッドをブロック
します。

BackgroundWorkerコンポーネントの例では、AutoResetEventクラスを使い、自
前で同様の機能を実現していましたが、Threadクラスでは、Joinメソッドを呼
び出すだけです。

引数月の Thread.Join(TimeSpan) を使えば、指定された時間が経過するまで
待つようにできます。


┌─┬─────────────────────────┬─┬─┬─┐
│☆│ C#プログラミングレッスン  (ぼぼ週刊)            │_│□│×│
├─┴─────────────────────────┴─┴─┴─┤
│ Published by Gushwell.                                           │
│ Copyright (C) 2004-2007 Gushwell All rights reserved.            │
│ Microsoft MVP Visual Developer - Visual C#(Apr 2005 - Mar 2008)  │
│-------------------- Gushwell's Page ---------------------------- │
│ 窓際プログラマーの独り言  :http://blog.livedoor.jp/gushwell/    │
│ 窓際プログラマーの読書三昧:http://gushwell.jugem.jp/            │
│ Gushwell's C# Programing Page:http://gushwell.ifdef.jp/         │
│ C#デザインパターン :                                             │
│  『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』  │
│   のサンプルコードをC#に移植したものを掲載しています。           │
│   移植後のコードの公開は、結城氏の了解を得ています。             │
│   http://blog.livedoor.jp/gushwell/archives/50333227.html        │
└─────────────────────────────────┘

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。