热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#中的多线程(1)

虽说我声称要大步跨进开源界,但毕竟现在自己肚子还没几两开源墨水也不知道能分享点什么。想想.NET不也算是开源得差不多了嘛,分享下C#的知识也还是OK的。本文(系列)是知识调侃普及型

    虽说我声称要大步跨进开源界,但毕竟现在自己肚子还没几两开源墨水也不知道能分享点什么。想想.NET不也算是开源得差不多了嘛,分享下C#的知识也还是OK的。

    本文(系列)是知识调侃普及型文章,不专业,但对于不知从何入手的小白,可以充当打辅助的作用。

    好了,进入正题。

Thread 类参考 :https://msdn.microsoft.com/zh-cn/library/system.threading.thread(v=vs.110).aspx

    start()是开始运行线程,sleep(int)是当前进程挂起指定时间数,abort()是终止当前进程,jion()能使并行变串行,我们来一一试试。

 1 class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Thread t = new Thread(run);//这个run是函数的名称哦,实际上是一个委托。
 6             t.Start();//先运行这个线程,再运行下面的的输出。
 7             Console.WriteLine("test");
 8              Console.ReadKey();
 9          }
10          static void run()
11          {
12              int i=0;
13              while (i <999999)
14              {
15                  i++;
16              }
17              Console.WriteLine(i);
18          }
19      } 

 

 运行结果是:

    很明显的在t线程中的循环正在计算的过程中,主线程(main函数所在的线程)已经同时先把test输出了。这就是最基本的多线程。

    如果希望在运行start()后,运行完t线程再继续运行主线程,可以加入jion()函数。

 1     class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Thread t = new Thread(run);
 6              t.Start();
 7              t.Join();//看这里,这里多加了这一句代码。
 8             Console.WriteLine("test");
 9              Console.ReadKey();
10          }
11          static void run()
12          {
13              int i=0;
14              while (i <999999)
15              {
16                  i++;
17              }
18              Console.WriteLine(i);
19          }
20      } 

运行结果是:

    相比起刚才,顺序就颠倒过来了不是。

    OK,Sleep()和abort()我现在不想演示,晚一点再演示。

    有了这两个demo,我们来说点理论知识:

    操作系统起初是不能并行计算的,比如发送一个指令去让打印机打印一份文档,在打印机工作的过程中,操作系统要等到打印机打印完后返回已完成的指令,才继续运行下一个程序,这就导致了很多时间CPU都在等待资源(打印机的完成指令),相当浪费。后来,操作系统的设计者为此设计了多进程机制(其实和多线程大同小异),把每一条进程都放入一条运行队列中,当一个进程需要等待资源才能继续的时候,这个进程就进入阻塞状态,被放进了另一条专门装阻塞进程的队列里。当这个阻塞的进程得到了需要的资源,阻塞状态就解除了,又被放回了运行队列中。当多进程环境中的进程多了,内存肯定就不够用了,这时候为了进程信息不被清除掉,操作系统为此设计了一个叫做挂起的状态,说得直接点就是放在磁盘(硬盘)中的阻塞队列,没啥不同,windows的虚拟内存你听过没?就是为这个准备的。当内存有空位后,挂起进程就又被唤醒回到内存中了。

    多线程第一篇就讲到这。


推荐阅读
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
iz76mww
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有