【C#】多线程

进程(Process)

概念:进程(Process)是计算机中的程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

简单理解:打开一个应用程序就是在操作系统上开启了一个线程。

特点:进程之间可以互相独立运行,互不干扰。

进程之间也可以互相访问、操作。


线程(Thread)

概念:线程是操作系统能够进行运算调度的最小单位。

线程被包含在进程之中,是进行中的实际运行单位。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程。

进程是资源分配的基本单位,线程是独立调度的基本单位。


多线程

多线程是指在一个程序中,可以同时运行多个不同的线程。


语法

  1. 声明一个新线程

    新线程要执行的代码逻辑被封装到一个函数语句块中。

    Thread thread = new Thread(NewThread);  
    
  2. 启动新新线程

    thread.Start();
    
  3. 设置为后台线程

    一般地,当前台线程或者主线程结束了,不管后台线程是否在进行,整个进程结束。后台线程不会阻碍应用程序的进程结束。所以,如果不将新的线程设置为后台线程,可能导致进程无法正常关闭。比如,将新线程设置成无限循环执行,当主线程代码已经执行完成时,新线程依然在循环,这样,就不能通过主线程结束来实现整个程序进程的结束。

    thread.IsBackground = true;
    
  4. 关闭释放一个线程

    如果新开的线程可以结束,则不需要特殊处理,正常结束。

    如果新开的线程是死循环,终止这个线程的方式有两种。

    static bool isRunning = true;
    static object object1 = new object();
    static void Main(string[] args)
    {
        //方式一
        //设置循环死循环标识
        //Console.ReadKey();
        //isRunning = false;
        //Console.ReadKey();
    
        //方式二
        //通过线程提供的方法(在.Net core版本中无法中止,会报错。)
        //thread.Abort();
    }
    
    static void NewThread()
    {
        //新开线程,执行的代码逻辑在该函数语句块中。
        while (isRunning)
        {
            //Thread.Sleep(1000);
            //Console.WriteLine("新开线程");
            lock (object1)
            {
                Console.SetCursorPosition(10, 6);
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write("■");
            }
        }
    }
    
  5. 线程休眠

    休眠多少毫秒,1秒等于1000毫秒。
    在哪个线程中执行,就让哪个线程休眠。
    Thread.Sleep(1000);


多线程共享数据——锁

多个线程使用的内存是共享进程的,所以,当多个进程同时操作同一片内存区域时,会产生问题,代码执行顺序错乱。

可以通过加锁的形式避免此问题。

lock

语法:lock(引用类型对象) { }

static bool isRunning = true;
static object object1 = new object();
static void Main(string[] args)
{
    while (isRunning)
	{
   	 	lock (object1)
        {
           Console.SetCursorPosition(0, 0);
           Console.ForegroundColor = ConsoleColor.Red;
           Console.Write("●");
        }
	}
}

static void NewThread()
{
    //新开线程,执行的代码逻辑在该函数语句块中。
    while (isRunning)
    {
        //Thread.Sleep(1000);
        //Console.WriteLine("新开线程");
        lock (object1)
        {
            Console.SetCursorPosition(10, 6);
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("■");
        }
    }
}

多线程对于我们的意义

可以用多线程专门处理一些复杂耗时的逻辑,比如寻路,网络通信等。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值