---マルチスレッドプログラミング学習シリーズのスレッドの基礎

ブロガーは宣言:私は、書き込みに代わって、技術の限られたレベルの場合はないですが、また、神のポインティングをしてください。ライトスプレー ...

1:スレッドを作成します。

static void Main(string[] args)
{
    #region 创建线程
    Thread thread = new Thread(PrintNumbers);
    thread.Start();
    PrintNumbers();
    Console.ReadKey();
    #endregion

}

static void PrintNumbers()
{
    Console.WriteLine("Starting...");
    for(int i = 0;i<10;i++)
    {
        Console.WriteLine(i);
    }
}
結果(各実行の結果は同じではありません):

画像

原理:

我々は、スレッド、インスタンス、またはParameterizedThreadStart ThreadStartを構築する場合には手数料がコンストラクタに渡されます、私たちはメソッド名を開発する必要があり、その後、別のスレッドを実行し、C#コンパイラは、バック、これらのオブジェクトを再作成します。その後、通常の方法でメインスレッドで、私たちはPrintNumbersメソッドを実行するスレッドを開始します。

2:一時停止スレッド

static void Main(string[] args)
{
    #region 暂停线程
    Thread thread = new Thread(PrintNumbersWithDelay);
    thread.Start();
    PrintNumbers();
    Console.ReadKey();
    #endregion

}

static void PrintNumbers()
{
    Console.WriteLine("Starting...");
    for(int i = 0;i<10;i++)
    {
        Console.WriteLine(i);
    }
}

static void PrintNumbersWithDelay()
{
    Console.WriteLine("WithDelayStarting...");
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(TimeSpan.FromSeconds(2));
        Console.WriteLine(i);
    }
}
結果(完全には示されていません)。

画像

どのように動作します:

2秒間休止状態PrintNumbersWithDelayメソッド呼び出しのThread.sleep、任意のデジタル印刷が指定された時間を待っています前に、コードを実行するスレッドの原因となります。スレッドがスリープ状態にあるとき、それは少しCPU時間として取り上げます。我々はPrintNumbersWithDelay方法よりも、コードのコードPrintNumbers方法を見つけるの結果は、最初の実行中のスレッドを分離します。

3:スレッドが待機

static void Main(string[] args)
{
    #region 线程等待
    Console.WriteLine("WithDelayStarting...");
    Thread thread = new Thread(PrintNumbersWithDelay);
    thread.Start();
    thread.Join();
    Console.WriteLine("Thread Completed...");
    Console.ReadKey();
    #endregion

}

static void PrintNumbersWithDelay()
{
    Console.WriteLine("WithDelayStarting...");
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(TimeSpan.FromSeconds(2));
        Console.WriteLine(i);
    }
}
結果:

画像

どのように動作します:

プログラムの実行は、デジタル印刷に長いスレッドを起動すると、それぞれの番号を印刷する前に、私たちは完全にスレッドスレッドまで待つことを可能にする方法thread.Join呼び出し、後に2秒を待ちます。スレッドは、スレッドを終了すると、メインスレッドが実行され続けます。

4:スレッドの終了

static void Main(string[] args)
{
    #region 线程终止
    Console.WriteLine("Starting Program....");
    Thread thread = new Thread(PrintNumbersWithDelay);
    thread.Start();
    Thread.Sleep(TimeSpan.FromSeconds(6));
    thread.Abort();
    Console.WriteLine("A Thread has been aborted....");
    Thread t = new Thread(PrintNumbers);
    t.Start();
    PrintNumbers();
    Console.ReadKey();
    #endregion

}

static void PrintNumbersWithDelay()
{
    Console.WriteLine("WithDelayStarting...");
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(TimeSpan.FromSeconds(2));
        Console.WriteLine(i);
    }
}

static void PrintNumbers()
{
    Console.WriteLine("Starting...");
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i);
    }
}
結果:

画像

どのように動作します:

メインルーチンと6秒のスレッドで、その結果、スレッドにThreadAbortExceptionの注入方法を与えるthread.Abort方法を、待っているデジタル印刷、コールを実行している別のスレッドが終了される。この方法は、常にスレッドを終了しない、ターゲットスレッドは例外とコールを処理することができます。終了することを拒否するので、スレッドを閉じるために、この方法はお勧めしませんTread.ResetAbortの方法。

5:スレッドの優先順位

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"Current thread priority:{Thread.CurrentThread.Priority}");
        //在所有可用的CPU上运行
        Console.WriteLine("Running on all cores available");
        RunThreads();
        Thread.Sleep(TimeSpan.FromSeconds(2));
        Console.WriteLine("Running on a single core");
        //设置单核CPU运行
        Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
        RunThreads();
        Console.ReadKey();
    }

    static void RunThreads()
    {
        var sample = new ThreadSample();
        var threadOne = new Thread(sample.CountNumbers);
        threadOne.Name = "ThreadOne";
        var threadTwo = new Thread(sample.CountNumbers);
        threadTwo.Name = "ThreadTwo";
    
        threadOne.Priority = ThreadPriority.Highest;
        threadTwo.Priority = ThreadPriority.Lowest;
        threadOne.Start();
        threadTwo.Start();
    
        Thread.Sleep(TimeSpan.FromSeconds(2));
        sample.Stop();
    }
}

class ThreadSample
{
    private bool _isStopped = false;
    public void Stop()
    {
        _isStopped = true;
    }

    public void CountNumbers()
    {
        long counter = 0;
        while(!_isStopped)
        {
            counter++;
        }
    
        Console.WriteLine("{0} with {1,11} priority " +
                           "has a count = {2,13} ",
                           Thread.CurrentThread.Name,
                           Thread.CurrentThread.Priority,
                           counter.ToString("N0"));
    }
    
}
結果:

画像

原理:

ほとんどの時間CPUコアので、二つのスレッド、優先度が非常に近く、すべての利用可能なCPUの所見上の2つのスレッドを開始する際に、最高最低ですが、単一のCPU上で設定するとき、結果が大きく異なる定義実行するために優先度の高いスレッドで、唯一のスレッドの残りの部分を残すようにして実行するのに非常に少しの時間です。

6つのスレッドを渡すパラメータ

class Program
{
    static void Main(string[] args)
    {
        //构造
        var sample = new ThreadSample(5);
        var threadOne = new Thread(sample.CountNumbers);
        threadOne.Name = "ThreadOne";
        threadOne.Start();
        threadOne.Join();
        Console.WriteLine("-----------------------------");
        //Thread.Start
        var threadTwo = new Thread(Count);
        threadTwo.Name = "ThreadTwo";
        threadTwo.Start(5);
        threadTwo.Join();
        Console.WriteLine("-----------------------------");
        //lambda
        var threadThree = new Thread(() => CountNumbers(5));
        threadThree.Name = "ThreadThree";
        threadThree.Start();
        threadThree.Join();
        Console.WriteLine("-----------------------------");

        int i = 10;
        var threadFour = new Thread(() => PrintNumber(i));
        i = 20;
        var threadFive = new Thread(() => PrintNumber(i));
        threadFour.Start();
        threadFive.Start();

        Console.ReadKey();
    }

    static void Count(object iterations)
    {
        CountNumbers((int)iterations);
    }

    static void CountNumbers(int iterations)
    {
        for(int i =1;i<iterations;i++)
        {
            Thread.Sleep(TimeSpan.FromSeconds(0.5));
            Console.WriteLine($"{Thread.CurrentThread.Name} prints {i}");
        }
    }

    static void PrintNumber(int number)
    {
        Console.WriteLine(number);
    }
}

class ThreadSample
{
    private readonly int _iterations;

    public ThreadSample(int iterations)
    {
        _iterations = iterations;
    }

    public void CountNumbers()
    {
        for (int i = 1; i < _iterations; i++)
        {
            Thread.Sleep(TimeSpan.FromSeconds(0.5));
            Console.WriteLine($"{Thread.CurrentThread.Name} prints {i}");
        }
    }
}
結果:

画像

原理:
  • 最初:ThreadSampleオブジェクトを作成し、コンストラクタのパラメータを提供して、スレッドを起動し、オブジェクトのメソッドのCountNumbersを使用します
  • 第二:使用Thread.Start方法はスレッドを開始する過程でObject型の単一のパラメータを受け入れる必要があります
  • 第三:ラムダ式は、パラメータを使用して別のメソッドを呼び出すメソッドを与えられたクラスに属し、この方法は、ラムダ式の任意のローカル変数、C#は、Aを生成する際に閉鎖ストッパと呼ばれませんクラス、およびクラスのプロパティとして変数。あなたは、彼らが変数の値を共有するラムダ式で同じ変数を使用する場合、これは、いくつかの問題を引き起こす可能性があります。threadFourとthreadFiveスレッドを開始すると、印刷が20です。
公開された37元の記事 ウォンの賞賛3 ビュー6336

おすすめ

転載: blog.csdn.net/huan13479195089/article/details/88797254