(一)学习之前首先弄明白两个问题
1.线程,进程,应用程序域的关系?
线程是进程的基本执行单元,在进程的入口,执行的第一个线程,是主线程。主线程都是以Main()方法作为入口的。
进程包含运行程序所需的资源;可以理解为运行程序的基本边界。
应用程序域是一个程序运行的逻辑区域。
总结:进程是一个应用程序的边界,包含了其运行所需的资源。一个进程可以包含多个应用程序域。
同一时刻,线程只会包含在同一个应用程序域中。
2.关于多线程的问题?
对于单核CPU,在单位时间(time slice)内,只有单个线程在运行;运行顺序取决于线程的优先级。
对于单位时间内未运行完的线程,状态信息将保存在本地存储其中,以便下次继续运行。
线程之间以极快的频率切换运行,造成多线程的假象。
(二)C#中关于线程的主要方法和属性
实例化线程对象: Thread thread=new Thread(方法名);
Thread.IsBackground 属性。后台线程不会防止应用程序的进程被终止。当前台线程都结束了的时候,整个程序也就结束了,即使后台线程还没结束。
线程安全:使用排他锁lock 当两个线程争夺一个锁的时候,一个线程等待,或者说被阻止到那个锁变的可用。
.CurrentThread.Name = "main"
;//命名线程
.Start() 方法启动线程。
.Abort()方法终止线程。
.Suspend()挂起线程。
.Resume()恢复线程。
.Join()阻止原线程执行,知道新线程执行完。
//.join()使用代码说明
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Test
{
class TestThread
{
private static void ThreadFuncOne()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + " i = " + i);
}
Console.WriteLine(Thread.CurrentThread.Name + " has finished");
}
static void Main(string[] args)
{
Thread.CurrentThread.Name = "MainThread";
Thread newThread = new Thread(new ThreadStart(TestThread.ThreadFuncOne));
newThread.Name = "NewThread";
for (int j = 0; j < 20; j++)
{
if (j == 10)
{
newThread.Start();
newThread.Join();//阻塞主线程,可以将其屏蔽看看效果
}
else
{
Console.WriteLine(Thread.CurrentThread.Name + " j = " + j);
}
}
Console.Read();
}
}
}
其他的属性: