• 线程基础之创建,暂停,等待,锁


     1 using System;
     2 using System.Threading;
     3 using static System.Console;//语法糖 使用static #6.0特性 让我们可以访问类型的静态成员
     4  
     5 
     6 namespace Chapter1.Recipe1
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             //1.创建线程,执行循环打印DelayPrint()
    13             //2.之后立马执行PrintNumber()
    14             //3.但是 DelayPrint() 加入了Sleep 使线程处在休眠状态  占用CPU时间少 所以会先执行PrintNumbers() 
    15             Thread t = new Thread(DelayPrint);
    16             t.Start();//Start:线程开始
    17             PrintNumbers();
    18 
    19 
    20             //加入Join就避免了先执行PrintNumbers方法 DelayPrint没打印完成之前 Main不会往下走
    21             Thread t1 = new Thread(DelayPrint);
    22             t1.Start();//Start:线程开始
    23             t1.Join();//Join:线程等待
    24             PrintNumbers();
    25         }
    26       
    27         static void PrintNumbers()
    28         {
    29             WriteLine("Starting1...");
    30             for (int i = 1; i < 10; i++)
    31             {  //循环打印输入1-10
    32                 WriteLine(i);
    33             }
    34         }
    35         //延迟打印
    36         static void DelayPrint()
    37         {
    38             WriteLine("Starting2...");
    39             for (int i = 0; i <= 10; i++)
    40             {
    41                 Thread.Sleep(TimeSpan.FromSeconds(2));//线程暂停
    42                 WriteLine(i);
    43             }
    44         }
    45     }
    46 }
    线程创建,等待,查看
    using System;
    using System.Threading;
    using static System.Console;
    using static System.Threading.Thread;
    
    namespace Chapter1.Recipe5
    {
        class Program
        {
            static void Main(string[] args)
            {
                WriteLine("Starting program 开始程序...");
                Thread t = new Thread(PrintNumbersWithStatus);//创建线程t 打印当前线程状态
        
                t.Start();
            
            
                for (int i = 1; i < 100; i++)
                {//在执行 Sleep之前县城是Running运行状态 执执行之后就可以获取到线程处于WaitSleepJoin等待状态
                    WriteLine(t.ThreadState.ToString());
                }
            
                 
                WriteLine("A thread has been aborted 这个线程是已经终止的");
                WriteLine(t.ThreadState.ToString()+"最后1");
            
            }
    
            
            //打印第几个线程状态状态
            static void PrintNumbersWithStatus()
            {
                WriteLine("Starting...开始");
                WriteLine(CurrentThread.ThreadState.ToString());
                for (int i = 1; i < 10; i++)
                {
                    Sleep(TimeSpan.FromSeconds(2));
                    WriteLine(i);
                }
            }
        }
    }
    查看当前线程状态
    using System;
    using System.Threading;
    using static System.Console;
    using static System.Threading.Thread;
    using static System.Diagnostics.Process;
    
    namespace Chapter1.Recipe6
    {
        class Program
        {
            static void Main(string[] args)
            {
                WriteLine($"Current thread priority 当前线程优先级: {CurrentThread.Priority}");
            
                RunThreads();
                Sleep(TimeSpan.FromSeconds(2));
                WriteLine("Running on a single core在单个CPU上运行");
                GetCurrentProcess().ProcessorAffinity = new IntPtr(1);//让操作系统运行在单个CPU上 得到优先级或高的线程会计算更多
                RunThreads();
            }
            //执行两个线程 设置优先级并让他们各自迭代 两秒后暂停所有线程并得到迭代数字
            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();
    
                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++;
                    }
    
                    WriteLine($"{CurrentThread.Name} with " +
                        $"{CurrentThread.Priority,11} priority " +
                        $"has a count = {counter,13:N0}");
                }
            }
        }
    }
    线程优先级,在单核下优先级越高CPU给他的时间更多

    1:为什么要使用锁(Lock):

      1,多个线程共享一个资源,必须保证当前线程使用该资源的时候,所以其他线程需要等待当前线程完成操作

      2,使用Lock来实现这种行为,但是使用之后其他线程将会处于阻塞状态,这也会带来性能问题,

      3,lock其实就是Monitor类的一个语法糖

      4,使用try/catch块的时候 不要在线程外捕获异常,捕获不到, 应该在编写线程的代码块中捕获异常

  • 相关阅读:
    关于泛型
    共享几个.net工具类
    关于Guid
    自动更新解决方案
    订阅者模式实例
    好久没有blog了,今日就share一个update program的经验
    杀掉相应数据库的进程
    解决IFrame下无法写Cookie问题
    sql处理死锁
    log4net配置及使用方法
  • 原文地址:https://www.cnblogs.com/LZXX/p/11822010.html
Copyright © 2020-2023  润新知