博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程编程学习笔记-基础(一)
阅读量:5322 次
发布时间:2019-06-14

本文共 3405 字,大约阅读时间需要 11 分钟。

一、多线程介绍

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));            }        }        ///         /// 暂停2秒的方法        ///         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();                   }           ///         /// 暂停2秒的方法        ///         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()方法,程序的运行结果如上图。请自行比较两个结果的区别。

 

 

转载于:https://www.cnblogs.com/chillsrc/p/7693038.html

你可能感兴趣的文章
数据库的标识符可以有多长
查看>>
新手村之循环!循环!循环!
查看>>
在创业公司上班的感受
查看>>
Shell脚本
查看>>
masm32V11配置
查看>>
ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath
查看>>
通过Python、BeautifulSoup爬取Gitee热门开源项目
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
集合的内置方法
查看>>
IOS Layer的使用
查看>>
Android SurfaceView实战 带你玩转flabby bird (上)
查看>>
Android中使用Handler造成内存泄露的分析和解决
查看>>
android代码控制seekbar的样式
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>
pdnovel 看书 读书 听书
查看>>
Linked List Cycle II
查看>>
个人作业
查看>>
下拉刷新
查看>>
linux的子进程调用exec( )系列函数
查看>>