小老虎学习多线程(1)

         很久没有更新我的博客了,最近在做一个项目,并测试了我的持久层框架以及一些控件,在这个项目中学习了很多的东西,充分认识到了自己的不足。本来上次那个控件开发的系列应该写完的,但是在这个项目中又进行了一次新的总结,并修改了一些控件开发方面的东西,将在近一个月的时间里陆续更新至我的博客中,在这里向那些关注本博客的兄弟、姐妹们致以深深的歉意,对不起。在本次的博客更新中,将控件开发和持久层相关知识与总结更新上来。

        多线程学习

(题外话)    在日常开发中,会使用到多线程等相关知识进行复杂的系统功能开发。在分布式、并行计算的今天,好像多线程知识被深深的隐藏起来。我在这里仅仅想向很多兄弟、姐妹提醒一下,可能有时候了解一些多线程的知识会非常有用。

(-------------------------------------------------------------------------------------------------------------------------------------------------------------------------华丽的分割线---------------------------------------------------------------------------------------------------------------------------------------------------------)

      线程的生存周期:

      当安排一个线程继续工作时,线程会经历几个常见的状态:未启动、激活、睡眠等等。线程状态由System.Thread.ThreadState枚举标示:

      bg_btn Aborted:线程处于停止状态,但是并不代表线程已执行完毕。

      bg_btn AbortRequested:Abort()方法已调用,但是线程并未停止(当前线程未接收到终止通知异常【System.Thread.ThreadAbortException】),但是线程将在不久之后终止。

      bg_btn Background:当前线程转入后台运行状态。

      bg_btn Running:线程已启动,但是并未终止。

      bg_btn Stopped:线程已执行完成了所有的指令,并且已经停止。

      bg_btn StopReqequested:请求停止当前线程中。

      bg_btn Suspend:线程处于挂起状态。

      bg_btn SuspendRequested:线程被请求挂起中。

      bg_btn Unstarted:线程还未启动,即从未调用Start()方法。

      bg_btn WaitSleepJoin:通过Wait()、Sleep()、Join()方法,来暂停的线程。

线程生命周期与状态切换图:

image

 

1.1   线程休眠

Thread类提供了Sleep()方法,用于使当前线程休眠。首先查看下面一段代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace _2._2
{
    class Program
    {
        public static Thread work1;
        public static Thread work2;

        static void Main(string[] args)
        {
            Console.WriteLine("进入Main函数");
            work1 = new Thread(new ThreadStart(Count1));
            work2 = new Thread(new ThreadStart(Count2));
            
            work1.Start();
            work2.Start();

            Console.WriteLine("\n离开Main函数");
        }

        public static void Count1()
        {
            Console.WriteLine("\n进入Count1函数");
            for (int i = 0; i < 50; i++)
            {
                Console.Write(i+"\t");
                if (i == 10)
                    Thread.Sleep(1000);
            }
            Console.WriteLine();
            Console.WriteLine("\n离开Count1函数");
        }

        public static void Count2()
        {
            Console.WriteLine("\n进入Count2函数");
            for (int i = 51; i < 100; i++)
            {
                Console.Write(i + "\t");
                if (i == 70)
                    Thread.Sleep(1000);
            }
            Console.WriteLine();
            Console.WriteLine("\n离开Count2函数");
        }

    }
}

运行效果如下所示:

image

注意在以上的运行结果,可能与各位的不同,多线程程序与硬件环境有相当大的关系。

实际上,当控制台输出至70时,会停滞一下输出3-7,当输出10时,控制台又会停滞一下,继续输出剩下的数字。


posted @ 2010-04-14 22:16  hongbo0521  阅读(374)  评论(1编辑  收藏  举报