zoukankan      html  css  js  c++  java
  • (转)C#/.NET主线程与子线程之间的关系

         一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程。

          有的博客上说“至少一个主线程”,这一说法持有怀疑
             主线程与子线程之间的关系
             **默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程
             *当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束
             *当子线程是后台线程,则主线程的结束,会导致子线程的强迫结束
                (个人理解,这样设计的原因:因为后台线程一般做的都是需要花费大量时间的工作,如果不这样设计,主线程已经结束,而后台工作线程还在继续,第一有可能使程序陷入死循环,第二主线程已经结束,后台线程即时执行完成也已经没有什么实际的意义)
             
             实例代码:
            static Thread Mainthread;  //静态变量,用来获取主线程
          static void Main(string[] args)
            {
               Mainthread= Thread.CurrentThread;//获取主线程
               Test1();
              }
     private static void Test1()
            {
                Console.WriteLine("在主进程中启动一个线程!");
                Thread firstChild = new Thread(new ParameterizedThreadStart(ThreadProc));//threadStart 是一个委托,代表一个类型的方法
                firstChild.Name = "线程1";
                firstChild.IsBackground = true;
                firstChild.Start(firstChild.Name);//启动线程
                Thread secondChild = new Thread(new ParameterizedThreadStart(ThreadProc));
                secondChild.Name = "线程2";
                secondChild.IsBackground = true;
                secondChild.Start(secondChild.Name);
                Console.WriteLine("主线程结束");
                Console.WriteLine(Mainthread.ThreadState);
                Mainthread.Abort();
            }
            private static void ThreadProc(object str)
            {
                
                for (int i = 0; i < 10; i++)
                {
                   
                    Console.WriteLine(Mainthread.ThreadState);
                    Console.Write(str+"调用ThreadProc: " + i.ToString() + " ");
                    if (i == 9)
                        Console.WriteLine(str + "结束");
                    Thread.Sleep(2000);//线程被阻塞的毫秒数。0表示应挂起此线程以使其他等待线程能够执行
                }
            }
  • 相关阅读:
    03 Linux下运行Django项目
    02 Linux常用基本命令(二)
    01 Linux常用基本命令(一)
    08 基本数据结构
    07 Deque的应用案例-回文检查
    给select增加placeholder技巧
    易经中人生的六大阶段 :潜、现、惕、跃、飞、亢 你在第几个阶段?
    java 实现傅立叶变换算法 及复数的运算
    java 正则表达式 复习
    关于mysql varchar(N)
  • 原文地址:https://www.cnblogs.com/candyzhmm/p/5674386.html
Copyright © 2011-2022 走看看