【黑马程序员】关于线程的学习

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

对于一个正在运行的程序(即.exe文件)来说,它就是一个进程。这一个进程里面至少要有一个线程,也可以包含很多个线程,即多线程。同一个进程之间的多个线程之间可以“并发”执行。一个程序的默认线程就是它的主线程,当主线程正在执行任务时,它是不能进行其它任何操作的,只有主线程把这个任务进行完毕之后,它才能够响应其它操作。使用多线程,有以下几个优点:

1.让计算机“同时”做多件事情,节约时间;

2.后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况;

3.多线程可以让一个程序同时处理多个事情;

4.计算机CPU大部分时间处于空闲状态,浪费了CPU资源。

多线程既然可以做这么多事,那么如何在.Net中实现多线程呢?首先,线程肯定也是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。当线程启动时,就可以通过调用传过来的委托来实现用线程执行该方法。

有这样一个如图所示的窗体:

主要代码如下所示:

/// <summary>
        /// 单线程处理方法事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSingleThread_Click(object sender, EventArgs e)
        {
            NewMethod();
        }

        /// <summary>
        /// 线程执行的方法
        /// </summary>
        private static void NewMethod()
        {
            DateTime beginTime = DateTime.Now;  //循环开始的执行时间
            for (int i = 0; i < 999999999; i++)
            {

            }
            TimeSpan ts = DateTime.Now.Subtract(beginTime);  //循环结束时间隔的时间
            MessageBox.Show("执行完毕!" + ts.TotalMilliseconds);
        }

        /// <summary>
        /// 多线程处理方法事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMultiThread_Click(object sender, EventArgs e)
        {
            //创建线程对象,同时传入一个委托
            Thread thread = new Thread(new ThreadStart(NewMethod));
            //把该线程设置为后台线程
            thread.IsBackground = true;
            //启动线程
            thread.Start();
        }

如下图:当我们点击“单线程的缺点”这个按钮时,主线程执行循环操作,这时候我们不能对窗体作其它任何操作(比如:移动窗体),因为对窗体进行的任何操作都是由主线程来监听的,但此时主线程正在执行循环,它无法分身来响应我们对它进行的操作。而当我们点击“多线程的实现”这个按钮时,我们发现,此时可以对窗体进行诸如移动窗体之类的操作,因为循环里面的代码已经交给另一个线程在执行,此时主线程是空闲的,所以可以响应用户的操作。单线程执行结果

多线程执行结果 

另外,在程序中,我定义了一个TimeSpan来获取执行循环所要花费的时间(毫秒)。我们可以看到,多线程的执行时间明显要比单线程大那么一点。这是因为我们对窗体进行过移动的操作,多出来的时间就是CPU响应用户对主窗体进行操作的时间。在单线程里面,我们必须要等到CPU执行循环完毕之后,才可以对窗体进行其它操作,但此时CPU的资源有很多都没有被使用。而在多线程里面,我们就不必花这个时间等待程序执行完毕再进行其它操作,因为主线程此时是空闲的。这就是以“空间”换时间。

在代码中,有这样一句话:thread.IsBackground = true; ,这段代码的意思是把当前创建的线程对象设置为后台线程。如果没有这段代码,那么在运行的时候,如果我们关闭主窗体(也就是退出程序),这个线程仍然会继续执行,因为它默认是前台线程。但有时我们在关闭主窗体时,不希望计算机响应我们之前对它进行的操作,此时我们就可以把它设置为后台线程。前台线程的特点是,只有所有的前台线程都关闭之后,程序才能退出。后台线程的特点是,只要所有的前台线程结束,不管后台线程有没有执行完毕,所有的后台线程都要关闭。因此要想点击关闭按钮的时候,程序也会退出,就要把新建的线程对象设置为后台线程。


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值