• C#多线程学习笔记


    1、首先引入Thread类库

    using System.Threading;

    2、创建线程,分为有参和无参

    static void show1(){
        Console.WriteLine("无参的线程");
    }
    static void show2(Object s){//这里的参数必须是Object类型
        Console.WriteLine("有参的线程,参数:"+s.toString());
    }
    static void Main(){
        Thread t1 = new Thread(show1);//无参第一种方法,直接传入函数名
        Thread t2 = new Thread(new ThreadStart(show1));//无参第二种,利用ThreadStart对象
        Thread t3 = new Thread(delegate(){Console.WriteLine("无参的线程");});//无参第三种,匿名函数
        Thread t4 = new Thread(()=>{Console.WriteLine("无参的线程");});无参第四种,lambda表达式
    
        t1.IsBackground = true;//是否后台,是则当主线程结束时,子线程同时结束
        t1.Start();//开启线程
        t2.Start();
        t3.Start();
        t4.Start();
    
        Thread t5 = new Thread(new ParameterizedThreadStart(show2));//利用ParameterizedThreadStart对象
        t5.Start("Hello");//通过Start传递参数
    }

    3、线程锁lock

    当多个线程操纵同一资源(如共用一个静态变量),需要加线程锁

    如下,不加线程锁时

        //通过t1 t2两个线程,访问数组arr,i代表访问下标,每访问一次自增一次
        class Program
        {
            static int[] arr = { 1,2,3,4,5,6,7,8,9};
            static int i = 0;
            static void Main(string[] args)
            {
                Program p = new Program();
                Thread t1 = new Thread(p.th);
                Thread t2 = new Thread(p.th);
                t1.IsBackground = true;
                t2.IsBackground = true;
                t1.Start();
                t2.Start();
                Console.ReadLine();
            }  
            public void th()
            {
                if (i <= 8) 
                {
                    Console.WriteLine(arr[i]);
                    i += 1;
                    th();
                }
            }     
        } 

    结果并不是从1-9

    1
    1
    3
    4
    5
    6
    7
    8
    9
    2

    以为时间片分配等原因,每次结果可能都不一样,所以必须加上锁

        public void th()
            {
                lock ("abc")//线程锁lock,abc是类似标识符的作用
                {
                    if (i <= 8) 
                    {
                        Console.WriteLine(arr[i]);
                        i += 1;
                        th();
                    }
                }
            }

    再执行发现正常

  • 相关阅读:
    省选模拟27
    省选模拟26
    省选模拟25
    省选模拟23
    PHP 各个框架的优缺点(超详细)
    windows 下安装中文版Git
    支付宝APP支付里设置应用网关和授权回调地址是不必填的
    linux服务器下安装phpstudy 如何命令行进入mysql
    js金钱转大写
    多个 (li) 标签如何获取获取选中的里面的某个特定值??
  • 原文地址:https://www.cnblogs.com/gaokaitai/p/10644076.html
Copyright © 2020-2023  润新知