单线程和多线程

来源:互联网 发布:mac我的所有文件整理 编辑:程序博客网 时间:2024/06/12 01:29

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

         先说进程,什么是进程呢?进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。简单的说就是一个运行的程序就是一个进程。

        再说线程,线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。多个线程可以共享一个进程中的资源以提高效率。一个进程中至少有一个线程,而一个进程默认是一个线程。在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行。就相当于人是一个进程,而手、眼、嘴是不同的线程,所以各个线程可以并行执行不同的任务,如人叼着烟卷数着钱还能看看美女,就相当于是三个线程的并行。

       虽然多线程看起来好像是同时做多件事情,但从微观上说是CPU在不停的轮流切换各个任务,每个任务执行相应的时间片后执行下一个任务,由于速度太快让我们感觉到它是在同时执行多个任务。

       线程是要执行一段代码的,所以要创建一个线程,必须先为该线程写一个方法,这个方法中的代码就是线程运行后所要执行的代码了。线程启动时,通过委托调用该方法,实现线程执行方法,用委托的原因是因为初始不知道要执行的方法是什么,所以等写好要执行的方法后再通过委托调用就很方便了。

       举个例子,在一个窗体中放一个按钮,点击按钮执行一段循环,来对比单线程和多线程的区别。


private void button1_Click(object sender, EventArgs e)        {            testThread();//单线程按钮调用方法        }        private void testThread()        {            for (int i = 0; i < 99999999999999; i++)            {                            }            MessageBox.Show("循环完毕");        }

        点击单线程执行按钮会调用方法testThead()来执行一段循环,在执行的过程中我们会发现窗体拖动不了,因为程序只有一个线程在不执行该方法的时候我们可以拖动窗体这是线程对我们的响应,但执行方法的时候线程忙着执行循环,这是拖动窗体就会没有反应了。而用多线程的话就不是这样了,在执行方法的同时我们可以拖动窗体,因为这是我们创建了另一个线程来执行循环,而UI线程继续响应我们的拖动操作。

        创建多线程首先引入using System.Threading;然后创建线程对象

private void button2_Click(object sender, EventArgs e)        {            Thread thread = new Thread(testThread);//线程要调用的方法是testThread            thread.Start();        }

        还有个有趣的现象,在点击多线程执行按钮后马上把窗体关掉,但过一会之后另一个线程调用的方法中弹出的提示窗口还是弹了出来,因为这时候前台线程还没有全部关闭,只有所有的前台线程都关闭才能完成应用程序的关闭。而后台线程呢,只要所有的前台线程都结束了后台线程自动结束。将线程设置为后台线程的方法很简单,只需一句代码。
thread.IsBackground = true;
带参数的方法怎么传入线程呢,其实就是一个委托,它可以传入一个object类型的参数。

private void button2_Click(object sender, EventArgs e)        {            Thread thread = new Thread(ShowName);//线程要调用的方法是testThread            thread.IsBackground = true;            thread.Start("Leonard");//传递的参数        }        private void ShowName(object name)        {            MessageBox.Show("name="+name.ToString());        }



------- Windows Phone 7手机开发、.Net培训、期待与您交流! ------  详细请查看:http://net.itheima.com

原创粉丝点击