黑马程序员—多线程,单线程

单线程与多线程比较:

单线程只能做一件事情,多线程可以做多种事情。多线程的应用,可以让一个程序同时做多种事情,提高效率。

单线程一次只会响应一个操作,当在响应一个操作的时候,用户再进行其他操作是不会响应的,最简单常见的一个列子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应,下面我们会说到。

默认一个进程只有一个线程,当我们想让一个进程做多种事情的时候,就应该多开线程;一个进程至少有一个线程,同一个进程中的多个线程之间可以并发执行。所谓线程并发执行,大致可以理解为,同时做多种事情;其实是每种事情做一段时间再切换到另一件事情,来回切换的执行。

多线程的优缺点:

     使用线程可以把占据时间长的程序中的任务放到后台处理;可以让用户界面更吸引人;可能使程序的运行速度更快等等。

    但是如果线程使用的太多可能会影响性能,操作系统需要不断的切换线程;更多的线程需要更多的内存空间;可能会带来更多bug等等。

.Net中如何实现多线程:

线程是要执行一段代码的。要产生一个线程,必须先为该线程写一个方法,该方法中的代码就是该线程运行所要执行的代码。线程启动时,要通过委托调用该方法(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)

当我们启用一个新线程的时候,要引用Threading命名空间。然后创建一个新线程Thread 名字 = new Thread(要新线程执行的方法);然后调用该线程的start方法,即名字. Start();然后就标记了该线程可以被CPU执行了,具体执行的时间由CPU决定。这里要执行的方法要是void的无参的方法或者是void的含有object类型参数的方法。

前台线程和后台线程:

一个线程默认的都是前台线程,想将一个线程设置为后台线程,需要把该线程的IsBackground设置为true,即名字.IsBackground = true;。

只有所有的前台线程都关闭才能完成程序关闭;只要所有的前台线程结束,后台线程就自动直接结束。

看以下小例子:

     我们创建一个Winform程序,添加两个按钮,一个为“单线程”,一个为“多线程”,分别点击,创建一个Add方法,进行for循环;单线程直接调用,多线程启动一个线程调用;界面如图:

 

代码如下:

Add方法:

void Add()

        {           

            for (int i = 1; i <= 700000000;i++ )

            {

               

            }

            MessageBox.Show("over");

        }

按钮单线程点击代码:

private void btnDan_Click(object sender, EventArgs e)

        {

            Add();           

        }

按钮多线程点击代码:

private void btnDuo_Click(object sender, EventArgs e)

        {

            Thread thread = new Thread(Add);

            thread.Start();   

        }

当我们点击按钮单线程的时候,拖动界面,发现我们是拖动不了界面的,只有for循环完毕,弹出over的时候才可以拖动;而点击按钮多线程,直接就可以拖动界面,同时for循环完毕,也会弹出over。但是我们会发现,关掉主窗口的时候,弹出来的over窗口还在,程序并没有完全关闭,还需要再关闭over窗口;这就是上面说的前台线程和后台线程的问题。我们需要在多线程里加一行代码:

thread.IsBackground = true;

把它设为后台线程。

posted @ 2013-05-07 21:01  帅大屋  阅读(315)  评论(0编辑  收藏  举报