• 多线程编程学习笔记-基础(一)


    一、多线程介绍

    C#通过多线程支持并行执行的代码。一个线程是一个独立执行的路径,可以同时与其他线程一起运行。一个C#客户端程序(Console,WPF,Winows Forms)开始于一个单独的线程,该线程由CLR和操作系统自动地创建,我们称它为主线程,而且可以通过创建附加的线程来实现多线程。

    二、初探

    1.创建第一个多线程程序

    2.打开visual studio 2015。新建一个控制台应用程序ThreadConsoleApp。如下图。

    3.此项目使用.net framework 4.5.2。

     

    4.代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading; //引入线程 
    
    namespace ThreadConsoleApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建一个线程来运行PrintNumber,当我们构造一个线程时,ThreadStart或ParameterizedThreadStart实例委托会传给构造函数
                //我们只需要指定不同线程需要运行的方法名,如下所示。编译器会自动在后台创建这些对象。
                Thread t = new Thread(PrintNumber);
                //启动线程
                t.Start();
                PrintNumber();
                Console.Read();   
    
            } 
    
            static void PrintNumber()
            {
                Console.WriteLine("第一个多线程程序开始。。。。");
                for (int i = 0; i <20; i++)
                {
                    long time = DateTime.Now.Ticks;
                    Console.WriteLine(string.Format("Ticks:{0} ==  {1}",time,i));
                }
    
            }
        }
    }

     5.程序运行结果如下

     

    从上图的结果图中可以看出来,两组范围为20的数字是随机交替出现的,说明PrintNumber方法即运行在主线程中,又运行中子线程中。

     

    三、暂停线程(Sleep)

    1.代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading; //引入线程 
    
    namespace ThreadConsoleApp
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Thread t = new Thread(PrintNumberDely);
                //启动线程
                t.Start();
                PrintNumber();
                Console.Read();         
    
            } 
    
            static void PrintNumber()
            {
                Console.WriteLine("第一个多线程程序开始。。。。Second:" + DateTime.Now.Second);
                for (int i = 0; i <10; i++)
                {
                    Console.WriteLine(string.Format("{0}",i));
                }
            }
    
            /// <summary>
            /// 暂停2秒的方法
            /// </summary>
            static void PrintNumberDely()
            {
                Console.WriteLine("第一个多线程暂停程序开始。。。。");
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(string.Format("Second:{0} ==  {1}", DateTime.Now.Second, i));
                    Thread.Sleep(TimeSpan.FromSeconds(2));        
    
                }
            }
        }
    }

     2.结果如下。

     

                                                            图1

                                                                       图2

    看结果图,如上面2图。当程序运行时,创建一个子线程运行PrintNumberDely()方法,然后执行PrintNumber,但是由于PrintNumberDely方法中存在暂停代码,所以每隔2秒才打印一个数字。

     

    四、线程等待(Join)

    1.代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading; //引入线程 
    
    namespace ThreadConsoleApp
    {
    
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("开始");
                Thread t = new Thread(PrintNumberDely);
                //启动线程
                t.Start();
                //线程等待
                t.Join();
                Console.WriteLine("结束");
                Console.Read();
               
    
            } 
    
      
    
            /// <summary>
            /// 暂停2秒的方法
            /// </summary>
            static void PrintNumberDely()
            {
                Console.WriteLine("第一个多线程等待程序开始。。。。");
    
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(string.Format("Second:{0} ==  {1}", DateTime.Now.Second, i));
                    Thread.Sleep(TimeSpan.FromSeconds(2));         
                  
                }
            }
        }
    }
    
     

     2.程序运行结果如下图。

     

     看结果图,当程序运行时,创建一个子线程运行PrintNumberDely()方法,但是由于我们调用了t.join()方法,所以主线程就会阻塞,直到子线程执行完毕,主线程才会继续执行,最后打印出“结束”。使用此技术,可以实现两个线程的同步执行,第一个线程等另一个线程执行完毕,才继续执行。


    注释join()方法,程序的运行结果如上图。请自行比较两个结果的区别。

     

     

  • 相关阅读:
    大数据面经
    mysql复习(2)
    java容器
    内存管理
    垃圾收集
    输入/输出流
    排序算法的稳定性及其汇总
    java传值与传引用
    linux复习6
    linux复习5
  • 原文地址:https://www.cnblogs.com/chillsrc/p/7693038.html
Copyright © 2020-2023  润新知