• 沾点多线程的名声赚点人气


    多线程技术,对于我来讲,也正如荷花一样,可远观而不可亵玩焉。为什么这么说呢,是因为很久以前就看过相关的博客以及书箱方面的介绍,但是一直在工作当中未尝使用过。当然这次也不是工作需要用到,只是单纯想学学多线程的使用方法,一来是加深对这方面知识的理解,二来是给大家抛砖引玉,三人行,必有我师焉。感觉自己一个人学,就像一个苦行僧,需要有很强的毅力才能成功。因为我不够毅力:),所以希望与大家共同学习,共同进步,希望得到大家的指点。

    谈到多线程,有些概念性的东西可能需要再次被搬到纸面上来谈。有程序、进程、线程等吧。

    不过说来也可笑,对于概念的东西,确实没什么吸引力,毕竟概念性的东西,读起来总是感觉晦涩难懂。没有实例来得简单明了。所以这里面,大家想了解的话,可点击网上详细的介绍(摘自http://blog.chinaunix.net/uid-21843387-id-3029913.html)。

     好了,其实不看概念也没有关系拉,毕竟我们用的资源管理器(见下图)来关程序或者是进程还用得少么。毕竟我们不是创造者,只是使用者。概念的东西是帮助我们去理解,而不是让我们受惑。对于我来讲,程序是一个电脑的入口。开启了这一个入口之后,就能在电脑里面注册激活它(进程)。它要做事情需要借助电脑的多种资源来完成(线程)。

    撇开别的不说,多线程为什么这么受青睐。这点大家都懂,因为现在的电脑是多核的CPU。对于CPU来讲,它的运行速度是很快的,但是其它设备的执行速度就很慢。就像短路运动接力一样,一个人再快,其它几个人不快也是白搭。所以对于单核CPU来讲的话,多线程可能还不能完全发挥功力。但是对于多核CPU来讲,那就不同了。多线程可以更有效地利用CPU资源,从而达到高效的目的。因为使用多线程技术,可以榨取CPU的休息(等待)时间。就像个老板一样,让工人拼命干活,保证多条流水线在同时进行生产。

    好拉,仁者见仁,智者见智。下面我们来看看怎么在C#里面使用多线程的实例吧。

    using System;
    using System.Threading;
    using System.Collections.Generic;
    
    public class Program
    {
        public static void Main(string[] args)
        {
           string content = "百川东到海,何时复西归?少壮不努力,老大徒伤悲。";
    
            //创建两个线程,分别来显示上面的一首诗
           Thread firstThread = new Thread(new ParameterizedThreadStart(Read));
           Thread lastThread = new Thread(new ParameterizedThreadStart(Read));
    
           Data firstTwoData = new Data();
           firstTwoData.Name = "First Thread";
           firstTwoData.Content = content.Substring(0, 12);
    
           Data lastTwoData = new Data();
           lastTwoData.Name = "Last Thread";
           lastTwoData.Content = content.Substring(12, 12);
    
           firstThread.Start(firstTwoData);
           lastThread.Start(lastTwoData);
    
           //使用Join方法,则主线程需要等调用Join方法的线程完成后再往下执行
           firstThread.Join();
           lastThread.Join();
            
           Console.WriteLine("处理完成,收工!");
    
            
           //调用About方法,则终止线程
           firstThread.Abort();
           lastThread.Abort();        Console.ReadLine(); } public static void Read(object data) { Data model = data as Data; if (model != null) { //将当前线程阻塞2s Thread.Sleep(2000); Console.WriteLine(string.Format("Thread Name:[{0}], Content:[{1}]", model.Name, model.Content)); } } public class Data { public string Name{get;set;} public string Content{get;set;} } }

    关于上面的实例,主要是介绍几个常用的多线程方法,方法都是在System.Threading这个命名空间当中。

    public Thread(ThreadStart start)

    多线程Thread类的构造函数,实例化这个类,即可创建一个多线程的实例。构造函数中的System.Threading.ThreadStart是一个委托,它表示此线程开始执行时要调用的方法。这里要调用的方法不可以有参数。

    public Thread(ParameterizedThreadStart start)

    多线程Thread类的构造函数,实例化这个类,即可创建一个多线程的实例。构造函数中的System.Threading.ParameterizedThreadStart 是一个委托,它表示此线程开始执行时要调用的方法。这里要调用的方法只能带一个参数。

           //创建两个线程,分别来显示上面的一首诗
           Thread firstThread = new Thread(new ParameterizedThreadStart(Read));
           Thread lastThread = new Thread(new ParameterizedThreadStart(Read));
    public static void Sleep(int millisecondsTimeout)

    多线程类调用这个方法,可以将当前线程挂起指定的时间。这是Thread类的静态方法,使用比较简单,只需要Thread.Sleep(毫秒时间)。

    public void Start()

    多线程类调用这个方法,即意味着这个多线程正式启动。调用这个方法,则意味着传递到多线程类的构造函数的委托是没有参数,即是使用System.Threading.ThreadStart的委托

    public void Start(object parameter)

    多线程类调用这个方法,即意味着这个多线程正式启动。调用这个方法,则意味着传递到多线程类的构造函数的委托是需要参数的,即是使用System.Threading.ParameterizedThreadStart的委托

           firstThread.Start(firstTwoData);
           lastThread.Start(lastTwoData);
    public void Join()

    多线程调用这个方法,即意味着在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。说白了,就是调用这个方法的多线程之后要执行的指令需要等调用的多线程完成之后才能继续执行。

    对于上面的例子来讲,由于两个线程firstThread和lastThread都调用了Join()方法。所以Console.WriteLine("处理完成,收工!");需要等两个线程firstThread和lastThread执行完成后,才能继续执行下面的指令。

           //使用Join方法,则主线程需要等调用Join方法的线程完成后再往下执行
           firstThread.Join();
           lastThread.Join();
            
           Console.WriteLine("处理完成,收工!");
    public void Abort()

    多线程调用这个方法,即可终止线程。

    本文作为入门的学习资料,简单介绍了多线程的常用使用方法。希望与大家一起学习。多线程技术是一门高深的技术,要使用得好,还是需要不断深入地学习,希望以后还会继续往这方面添砖加瓦。

    至此本文完。

  • 相关阅读:
    mescroll
    uniapp 实现常用功能拖拽
    并发之线程、进程、纤程、协程、管程与死锁,活锁
    jmeter中TPS和throughput的区别【杭州多测师】【杭州多测师_王sir】
    vite config
    s3工具awscli
    s3工具 rclone
    React错误: Can't resolve 'reactdom/client'
    React: ReactRouter嵌套路由 exact问题
    React报错:You are running `createreactapp` 5.0.0, which is behind the latest release (5.0.1).
  • 原文地址:https://www.cnblogs.com/csdbfans/p/3515529.html
Copyright © 2020-2023  润新知