前言:线程(Thread)是编程中的一个很重要的概念。 在很多情况下,采用多线程编程,可以提高应用程序响应速度、 提高运行效率、 提升吞吐量。
一,首先了解什么是线程
线程是代码的执行序列或者执行路径。 线程与进程的概念有一些相似,它类似于一个轻
量级的进程:一个操作系统中可以运行多个进程,一个进程内可以运行多个线程。 每个应用
程序至少运行在一个线程上。 当只有一个线程时,称作单线程应用程序,该线程由系统自动
创建,如以下代码所示。
class Program {
static void Main(string[] args) {
SharedResource resource = new SharedResource();
resource.Add("Item3");
Console.WriteLine("Main Thread Ends.");
Console.ReadKey();
}
}
public class SharedResource {
public List<string> list = new List<string> { "Item0", "Item1", "Item2" };
public void Add(string item) {
Console.WriteLine("Add " + item);
list.Add(item);
}
}
二,创建新线程
System.Threading命名空间下的Thread类提供了线程的基本操作。 通过创建一个
Thread对象,并执行它的Start()方法,可以新建并运行一个新的线程。下面的代码模拟了之前的代码执行流程。
class Program {
static void Main(string[] args) {
ThreadStart ts = new ThreadStart(ThreadEntry);
Thread worker = new Thread(ts);
worker.Start();
Console.WriteLine("Main Thread ends.");
Console.ReadKey();
}
static void ThreadEntry() {
SharedResource resource = new SharedResource();
resource.Add("Item3");
}
}
创建Thread对象之后,调用它的Start()方法,将会启动线程。 Start()方法是非阻塞的,
被调用之后会立即返回(Console.ReadKey()方法是一个阻塞方法的例子,在没有用户输入
之前,会一直等待,不会执行后续代码)。
注意事项
调用Start()后,新线程并非“立即”执行,这取决
于操作系统的线程管理策略,只不过这个时间非常短,感觉上好像新线程立即执行了。 因
此,上面代码的执行结果可能为:
Main Thread ends.
Add item3
也可能为:
Add item3
Main Thread ends.
这个时候就得注意:当多线程长时间运行的时候可能会某个线程停留一段时间,这个时候多个线程执行的代码速度差距将会有区别,如果需求是逐条执行或者有一定的顺序的时候需要做好逻辑上的处理。
同时 如果多条线程执行一个方法时,需要保证每个变量都是在可控范围内。
比如以下代码
Model model=new Model();
BLL bll = new BLL();
public void ThreadEntry()
{
model.a = xxx;
model.b = xxx;
model.c = xxx;
bll.insert(model);
}
我们在做单线程项目时经常会这样处理,但是在多线程项目中这样很容易导致数据出错,A线程给model赋值了 a=1,b=2,c=3 还没有执行添加操作的时候B线程进入方法给model.a赋值了5,这个时候数据就有问题了,A线程会将错误的数据添加入库。
所以在多线程使用同一方法时需要保证每个变量都是独立开的,代码因做如下改动。
BLL bll = new BLL();
public void ThreadEntry()
{
Model model=new Model();
model.a = xxx;
model.b = xxx;
model.c = xxx;
bll.insert(model);
}