36 多线程 知识点

//了解进程

//进程(Process)是计算机中的程序关于某数据集合上的一次运行活动
//是系统进行资源分配和调度的基本单位,是操作系统结构的基础
//说人话:打开一个应用程序就是在操作系统上开启了一个进程
//进程之间可以相互独立运行,互不干扰
//进程之间也可以互相访问、操作

//了解线程

//操作系统能够进行运算调度的最小单位
//它被包含在进程之中,是进程中的事件运作单位
//一条线程指的是进程中一个单一顺序的控制器,一个进程中可以并发多个线程
//我们写的程序 都在主线程中

//简单理解线程
//就是代码从上到下运行的一条”管道“

//语法相关

//线程类 Thread
//需要引用命名空间using system.Threading
// 1申明一个新的线程
//  注意 线程执行的代码 需要封装到一个函数中
     Thread t = new Thread(NewThreadLogic);

     static void NewThreadLogic()//线程方法
      {
            Console.WriteLine("新开一个线程");
      };
// 2启动线程
     t.Start();
// 3设置为后台线程

// 当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行
//后台线程不会防止应用程序的进程被终止掉
//如果不设置为后台线程 可能导致进程无法正常关闭

// 4关闭释放一个线程
// 如果开启的线程中不是死循环 是能够结束的逻辑 那么 不用刻意的去关闭它
//如果是死循环 想要中止这个线程 有两种方法
// 4-1 死循环种Bool标识
     Bool IsRuning=true; //默认为真,退出死循环致标识为False推出循环 
      static void NewThreadLogic()//线程方法
       {
            while(IsRuning)
          {
           //循环逻辑
          }
       };

// 4-2 通过线程提供的方法
     try
    {
      t.Abort();
      t=null;对空资源进行回收
    }
    catch
   {

   }
   

// 5线程之间共享数据

// 多个线程使用的内存是共享的,都属于该应用(进程)
//所以要注意 当多线程 同时操作同一片内存区域时可能会出现问题
//可以通过加锁的形式避免问题
     //lock 
     //当我们在多个线程当中想要访问同样的东西 进行逻辑处理时
     //lock(引用类型对象)
	
	
  //类如下列子
    static void Main(string[] args)
        {
           
            Thread t = new Thread(NewThreadLogic);
            t.Start();

            t.IsBackground = true;

            while (true)
            {
                Console.SetCursorPosition(0, 0);
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("@");
            }        
           
            Console.ReadKey();
        }

        static void NewThreadLogic()
        {
           while (true)
           {
                Console.SetCursorPosition(10, 0);
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("*");
            }
          
        }
      //输出结果如下图所示

image
原因是多线程内存共享,同时访问同一个内存区域进行读写,造成数据输出不确定性
对线程进行加锁使线程进行排队处理

  static readonly  object obj = new object();
        static void Main(string[] args)
        {
           
            Thread t = new Thread(NewThreadLogic);
            t.Start();

            t.IsBackground = true;

            while (true)
            {
                lock (obj)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("@");
                }
              
            }        
           
            Console.ReadKey();
        }

        static void NewThreadLogic()
        {
           while (true)
           {
                lock (obj )
                {
                    Console.SetCursorPosition(10, 0);
                    Console.ForegroundColor = ConsoleColor.Yellow ;
                    Console.Write("*");
                }
              
            }
          
        }
posted @ 2023-01-08 23:29  libaisheng9723  阅读(29)  评论(0)    收藏  举报