マルチスレッドの概念

大規模な森林ネットワーク技術を見つけるために、プラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守を、GPS!
http://cnsendnet.taobao.com
セン科学技術公式ブログから
http://www.cnsendblog.com/index.php/?p=431

 

図1に示すように、現在のスレッド

Thread.currentThread

図2に示すように、スレッド制御

  • スタート():スレッドを開始
  • スリープ(INT):静的メソッドは、ミリ秒単位のスレッドの現在の指定された数を一時停止します
  • アボート():このメソッドは、一般的にスレッドを終了するために使用され、エラーが再度スタートを実行します
  • サスペンド():このメソッドは、未完のスレッドを終了しない、それだけでも、回復した後、スレッドをハング
  • レジューム():実行の中断サスペンド()メソッドのスレッドを再開する
  • 入会():現在のスレッドが終了するまで待機し、メインスレッド

3、ThreadStateプロパティ

Thread.ThreadStateこのプロパティには、状態を実行中のスレッドを表します。

  • 中止された:スレッドが停止しました
  • AbortRequested:スレッドThread.Abort()メソッドが呼び出されていますが、スレッドは停止されていません
  • 背景:プロパティに関連する背景にあるスレッド、Thread.IsBackground
  • 実行:スレッドが正常に動作しています
  • 停止中:スレッドが停止されました
  • StopRequested:スレッドが停止するように要求されています
  • 一時停止:スレッドが中断されている(この状態では、あなたが再開()メソッドを呼び出すことで再実行することができます)
  • SuspendRequested:スレッドが応答するために十分な時間を中断するように求めされていませんが、
  • 未開始:Thread.Startは、実行中のスレッドを起動するために)(起動しません
  • WaitSleepJoin:スレッドがロックダウンで待機()、スリープ()または参加()メソッドを呼び出すため

図4に示すように、優先順位

最高から最低まで、五つの異なる優先レベルに設定することができますスレッドを作成するときにThreadPriority.Normalに優先順位、システムのデフォルト値を指定しない場合は、最低、最高、AboveNormal、通常、BelowNormalです。

//最低の設定の優先順位
myThread.Priority = ThreadPriority.Lowest。

図5に示すように、マルチスレッドの例

スレッドの関数への関数ポインタを実行するThreadStart Thread.Start()メソッドの呼び出しの後、理解されるように、プロキシによってThreadStart入口スレッドは、提供するために、機能を実行しているスレッドが開始さThreadStartを指摘しました。

 クラスプログラム
    { 
        静的 ボイドメイン(文字列[]引数)
        { 
            TestClassをテスト = 新しいTestClassを()。
            TH1スレッド = 新しいスレッド(新しいThreadStart(test.ThreadMethodを)); 
            th1.Start(); 
  
            // 主线程暂停4MS、CPU执行线程TH1 
            のThread.sleep(4 )。
  
            th1.Abort(); 
            th1.Join(); 
            Console.ReadLine(); 
        } 
    } 
  
    パブリック クラスTestClassを
    { 
        公共 ボイドThreadMethod()
        { 
            ながらtrueに
            { 
                Console.WriteLineをは(" スレッド1が実行されています" ); 
            } 
        } 
    }

6、スレッドのデッドロック

同時に使用しているリソースを防ぐために、C#のロックは、ロックとモニタリソースに使用され、処理が完了した後、リソースを解放します。あなたはモニターの交換ロックを使用することができますので、実際には、ときC#コンパイラのコンパイルロックステートメントに、クラスにコンパイルモニターロックを呼び出します。この方法を使用すると、最も可能性の高い、デッドロック状況につながります。

2つのリソースプリエンプション二つのスレッド、スレッド1個のグラブリソースA、必要なリソースB; 2グラブねじリソースBが、リソースAを必要とし、その結果、デッドロックです。

デッドロックの問題を解決し、あなたがMonitor.TryEntryを使用することができ、タイムアウトを設定

IF(Monitor.TryEntry(lockObj、1000 )){ 
      試み{ 
  
     } 
     最後に{ 
         Monitor.Exit(lockObj); 
     } 
} 
{ 
      // タイムアウト処理コード 
}

 

大規模な森林ネットワーク技術を見つけるために、プラットフォーム、サイト構築、ソフトウェア開発、システム運用・保守を、GPS!
http://cnsendnet.taobao.com
セン科学技術公式ブログから
http://www.cnsendblog.com/index.php/?p=431

おすすめ

転載: www.cnblogs.com/cnsend/p/12363624.html