一,简单单线程
线程是代码的执行序列或者执行路径。线程与进程的概念有一些类似,它类似于一个轻量级的进程;一个操作系统可以运行多个进程,一个进程内可以运行多个线程。每个应用程序至少运行在一个线程上。当只有一个线程时,称作单线程应用程序,该线程由系统自动创建。
下面看一个简单单线程例子:
如上图,本短程序从入口函数main进入,然后一次执行到结束。
执行main方法的线程通常被成为主线程,主线程的入口也是应用程序的起始点。对于单线程的应用程序来说,代码的执行是顺序的。
但是在多线程中,当新线程被手动开启之后,主线程将不再等待被开启的新线程,直接执行后面的代码。
二,创建新线程入口方法
下面来介绍两种为两种入口方法来进入新线程:
首先,引入线程的基本操作类:
下面是创建线程的方法:
namespace workerThreadTest { class Program { static void Main(string[] args) { #region ThreadStart定义无参数的入口方法 //ThreadStart ts = new ThreadStart(ThreadEntry);//新建立线程的入口 //Thread worker = new Thread(ts); //worker.Start(); //调用Thread的start方法启动线程; ////start方法是非阻塞的,被调用之后会立即返回 ////调用start后,新线程并非立即执行,这取决于操作系统的线程管理策略, ////只不过这个时间非常短,感觉上好像新线程立即执行了。 //Console.WriteLine("main thread ends"); //Console.ReadKey(); #endregion #region ParameterizedThreadStart委托 //ParameterizedThreadStart定义的方法参数为object类型,因此在线程的入口方法ThreadEntry内部需要进行一下类型转换 ParameterizedThreadStart ts = new ParameterizedThreadStart(ThreadEntry); Thread worker = new Thread(ts); string[] obj = { "item3","item4"}; worker.Start(obj); //开启有参数线程 Console.WriteLine("main thread ends"); Console.ReadKey(); #endregion } static void ThreadEntry(object obj) { ShareResource resource = new ShareResource(); string[] itemArray = (string[])obj; foreach (string item in itemArray) { resource.Add(item); } } //要开启的新线程 static void ThreadEntry() { ShareResource resource = new ShareResource(); resource.Add("item");//加入资源 } } public class ShareResource { public List<string> list = new List<string> { "Item0", "Item1", "Item2" }; public void Add(string item) { Console.WriteLine("Add:" + item); list.Add(item); } } }
创建一个新线程可以使用上述两种方法:ThreadStart方法和ParameterizedThreadStart方法,这两个方法分别定义了无参数的入口方法和有参数的入口方法。