一,简单单线程
线程是代码的执行序列或者执行路径。线程与进程的概念有一些类似,它类似于一个轻量级的进程;一个操作系统可以运行多个进程,一个进程内可以运行多个线程。每个应用程序至少运行在一个线程上。当只有一个线程时,称作单线程应用程序,该线程由系统自动创建。
下面看一个简单单线程例子:
如上图,本短程序从入口函数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方法,这两个方法分别定义了无参数的入口方法和有参数的入口方法。