一直以来对于多线程有种恐惧恐惧感,不理解它到底是什么回事,感觉挺抽象的,自从听了传智播客的邹老师对于多线程的讲解,我可以很自信地说我多线程方面入门了,特别是邹老师对于多线程有一套独有的方法,那就是画图,通过画图可以很直观地告诉你多线程是什么回事,比如UI线程和主线程,前台线程和后台线程,通过案例的讲解让你发现多线程的美妙。以下简单从如何创建多线程开始。首先来看用单线程的缺点:

通过对比单线程和多线程,创建了一个winform小程序来对比,界面如下:


进入代码区:

首先建立一个循环999999999次的方法:

view plaincopy to clipboardprint?
01.///
02./// 循环计数的方法
03.///

04.void CountTime()
05.{
06. DateTime beginTime = DateTime.Now;
07. for (int i = 0; i <= 999999999; i++)
08. {
09.
10. }
11. TimeSpan ts = DateTime.Now.Subtract(beginTime);
12. MessageBox.Show("执行完毕!!"+ts.TotalMilliseconds);
13.}
///
/// 循环计数的方法
///

void CountTime()
{
DateTime beginTime = DateTime.Now;
for (int i = 0; i <= 999999999; i++)
{

}
TimeSpan ts = DateTime.Now.Subtract(beginTime);
MessageBox.Show("执行完毕!!"+ts.TotalMilliseconds);
}回到界面单击“单线程的缺点”这个按钮,编写事件代码如下:

view plaincopy to clipboardprint?
01.//单线程的缺点
02.private void btnSingleThread_Click(object sender, EventArgs e)
03.{
04. CountTime();
05.}
//单线程的缺点
private void btnSingleThread_Click(object sender, EventArgs e)
{
CountTime();
}
点击运行,由于不能演示看,你会看到你无法拖动这个窗口移动摇晃,好像界面卡死了一样,过了一会儿,因为循环计数结束,弹出如下窗口:

2)那么如何解决这种UI卡死的问题呢,因为之前单单用到单线程的而出现卡死的问题是因为界面运行的时候,其实主线程只能去处理计数,而根本没有时间去处理你偶外的“拖动摇晃”这个事件,之道计数这个事情做完之后才会过来做“拖动摇晃”的这个事件,为了解决这个“假死”的事情,就要用到多线程技术,点击界面的“多线程”按钮,如下代码:

view plaincopy to clipboardprint?
01. //使用多线程来解决UI卡死问题
02. private void btnMulTread_Click(object sender, EventArgs e)
03. {
04. //ThreadStart ts = new ThreadStart(CountTime);
05. //Thread th = new Thread(ts);
06. //创建线程对象 传入要线程执行的方法
07. Thread th = new Thread(CountTime);
08. //将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
09. th.IsBackground = true;
10. //启动线程执行方法
11. th.Start();
12.
13.
14. }
//使用多线程来解决UI卡死问题
private void btnMulTread_Click(object sender, EventArgs e)
{
//ThreadStart ts = new ThreadStart(CountTime);
//Thread th = new Thread(ts);
//创建线程对象 传入要线程执行的方法
Thread th = new Thread(CountTime);
//将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
th.IsBackground = true;
//启动线程执行方法
th.Start();

}
这样点击运行并点击“多线程”按钮来执行的话,你会发现运行过程中你可以拖动窗口,非常流畅地拖动着走,直到运行结束弹出如下消息窗口:

细心的你可能会发现上面两个执行时间不一样,单线程用的时间比多线程用的少那么一点点,原因是因为CPU要来回转过去执行UI线程和计数线程,其实多线程的实际上不是同时执行,只是因为CPU处理速度太快了,可以非常快速地来回在各个线程之间切换执行,就好像我们先烧开水,然后不用去等开水开了就可以去洗衣服一样,因为CPU处理的速度太快了,我们人裸眼根本察觉不到它在各个线程之间不停地切换,感觉好像是同时运行一样。自从终于可以对多线程有一个入门的认识了。

多线程原来是这么简单相关推荐

  1. php和python的多线程,Python多线程以及线程锁简单理解(代码)

    本篇文章给大家带来的内容是关于Python多线程以及线程锁简单理解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 多线程threading 模块创建线程创建自己的线程类线程通 ...

  2. 多线程写文件_Shell简单实现多线程

    一.目的 解决Shell脚本单线程下效率低下的问题 二.适用场景 需要在Linux系统执行同一项命令,但是针对不同的对象,例如PING检测主机,当然可以延展,只要是命令之间不会产生冲突就可以了 三.场 ...

  3. 多线程爬虫python_一个简单的多线程Python爬虫

    最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模板引擎生成的HTML页面,用POS ...

  4. java多线程教程_java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它 ...

  5. CE3和UE3在多线程渲染方面的简单对比

    由于刚刚开始看CE3,对很多细节都还不是很熟,所以下面的有的针对CE3的描述可能是不准确的,在此先表歉意. CE3和UE3都支持多线程渲染,即有一个单独的渲染线程,当然它们都可以通过简单的办法来开关, ...

  6. 深入浅出多线程系列之四:简单的同步 lock

    1: 考虑下下面的代码: class ThreadUnsafe     {         static int _val1 = 1, _val2 = 1; internal static void  ...

  7. IOS多线程开发其实很简单

    http://blog.csdn.net/shenjie12345678/article/details/44152605 转载于:https://blog.51cto.com/8399249/165 ...

  8. Java 多线程编程两个简单的例子

    /*** @author gao*/ package gao.org;public class RunnableDemo implements Runnable{@Overridepublic voi ...

  9. Windows下C++多线程同步与互斥简单运用-转

    1.  互斥量,Mutex [cpp] view plaincopy #include <Windows.h> #include <iostream> using namesp ...

最新文章

  1. 根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
  2. 跨境电商未来应该怎么走?
  3. 计算机桌面颜色如何设置标准,电脑调整桌面颜色设置_电脑桌面颜色设置
  4. 日常必备的16条Linux命令
  5. docker客户端连接远程docker服务端(export方式)
  6. 剪切粘贴时总是上次的内容_Quicker 1.4版本更新内容
  7. python学习笔记--迭代器
  8. 上海市计算机一级客观题,2012年上海市高校计算机等级考试(一级)模拟卷客观题...
  9. Bootstrap表格内容垂直水平居中
  10. JAVA集合Collection与泛型<T>→List、ArrayList、LinkedList、→Set、HashSet、hashCode()→Map、HashMap、→Properties
  11. 1.TCP/IP 详解卷1 --- 概述
  12. python速学_60分钟Python快速学习(给发哥一个交代)
  13. 数据分析模型 第九章
  14. java精选视频资源,收藏慢慢看!
  15. secureCRT显示中文
  16. 六度分隔,邓巴数和幂律如何主宰我们的社交网络
  17. 关于MOSFET驱动电阻的选择
  18. 为什么您没有得到最好的承包商,您将如何做(第2部分)
  19. postgresql.conf bgwriter_lru_multiplier
  20. PwC普华永道——招聘

热门文章

  1. R语言——linux离线安装R包
  2. Echarts使用笔记
  3. Hibernate关键字inverse和cascade
  4. 编译时多态和运行时多态
  5. Windows Azure Tools DSInit Error
  6. 常用算法(C#): 猴子选大王问题
  7. .net程序员的盲点(一):参数修饰符ref,out ,params的区别
  8. python练习笔记——面试题 F(n) = F(n-1)+F(n-2)
  9. 服务器-番外篇-搭建samba共享
  10. Go连接MySql数据库too many connections