关闭

多线程原来是这么简单

611人阅读 评论(0) 收藏 举报

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

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

null
进入代码区:

首先建立一个循环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();
}
点击运行,由于不能演示看,你会看到你无法拖动这个窗口移动摇晃,好像界面卡死了一样,过了一会儿,因为循环计数结束,弹出如下窗口:
null
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();

}
这样点击运行并点击“多线程”按钮来执行的话,你会发现运行过程中你可以拖动窗口,非常流畅地拖动着走,直到运行结束弹出如下消息窗口:
null
细心的你可能会发现上面两个执行时间不一样,单线程用的时间比多线程用的少那么一点点,原因是因为CPU要来回转过去执行UI线程和计数线程,其实多线程的实际上不是同时执行,只是因为CPU处理速度太快了,可以非常快速地来回在各个线程之间切换执行,就好像我们先烧开水,然后不用去等开水开了就可以去洗衣服一样,因为CPU处理的速度太快了,我们人裸眼根本察觉不到它在各个线程之间不停地切换,感觉好像是同时运行一样。自从终于可以对多线程有一个入门的认识了。


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

原来多线程中的join()是这么回事

原来多线程中的join()是这么回事
  • huwei2003
  • huwei2003
  • 2016-11-08 16:04
  • 1720

Struts1,2,Servlet,Spring MVC单例多例 线程安全

Struts 1单例,线程不安全,在请求的时候被第一次初始化 action中的service对象为何不会出现数据存储的错误,大体意思就是每一个用户发出一次请求后就有一个独立的线程与之绑定,且有一个对...
  • zly9923218
  • zly9923218
  • 2016-04-11 21:31
  • 1667

ViewPager+Fragment原来这么简单

我们在使用微信或是网易客户端的时候都会看到下面这样的效果,左右滑动切换页面,点击table栏也可以切换界面,以前看着感觉好高大上,今天用ViewPager和Fragment实现了一下,其实还是蛮好实现...
  • u014733374
  • u014733374
  • 2014-12-18 16:59
  • 8032

多线程原来是这么简单

  • 2013-01-22 19:15
  • 68KB
  • 下载

黑马程序员——多线程原来是这么简单

作者: william_feng (1 篇文章) 日期: 十二月 16, 2011 在 11:59 上午 一直以来对于多线程有种恐惧恐惧感,不理解它到底是什么回事,感觉挺抽象的,自从听了传智...
  • gsl68
  • gsl68
  • 2012-02-25 10:50
  • 490

黑马程序员——多线程原来是这么简单

一直以来对于多线程有种恐惧恐惧感,不理解它到底是什么回事,感觉挺抽象的,自从听了传智播客的邹老师对于多线程的讲解,我可以很自信地说我多线程方面入门了,特别是邹老师对于多线程有一套独有的方法,那就是画图...
  • yenange
  • yenange
  • 2012-01-30 22:17
  • 720

自动显示和隐藏头布局的ListView原来是那么简单

尊重原创,转载请注明:From zsml2016(http://blog.csdn.net/qq_29269233)Power byzsml2016侵权必究! 前言: 今天在看Android进阶的书籍...
  • qq_29269233
  • qq_29269233
  • 2016-12-14 22:45
  • 1691

python3实现多线程破解tomcat简单密码

  • 2017-09-16 11:18
  • 18KB
  • 下载

iOS多线程简单介绍

  • 2016-01-06 23:06
  • 74KB
  • 下载

QT5.3.0 简单多线程开发

  • 2015-12-08 17:38
  • 12.58MB
  • 下载
    个人资料
    • 访问:4375064次
    • 积分:62188
    • 等级:
    • 排名:第47名
    • 原创:1739篇
    • 转载:2520篇
    • 译文:101篇
    • 评论:329条
    博客专栏
    最新评论
    微信公众号
      为你推荐最新的博文~更有惊喜等着你