基本知识
1、进程与线程:进程作为操作系统执行程序的基本单位,
拥有应用程序的资源,进程包含线程,进程的资源被线程共享,
线程不拥有资源。
2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。
当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,
所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。
4、阻塞线程:Join,阻塞调用线程,直到该线程终止。
5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,
终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException
异常让线程终止,通过捕获异常可以继续执行。
6、线程优先级:AboveNormal BelowNormal Highest Lowest Normal,
默认为Normal。
static void Main(string[] args)
{
object o = "HelloWorld";
// 创建一个新线程(默认为前台线程)
Thread t1 = new Thread(new ThreadStart(T1Star));
Thread t2 = new Thread(new ParameterizedThreadStart(T2Star));
// 使线程成为一个后台线程
t1.IsBackground = true;
t2.IsBackground = true;
// 通过Start方法启动线程
t1.Start();
t2.Start(o);
Console.ReadKey();
}
private static void T2Star(object obj)
{
Console.WriteLine("1" + obj);
}
// 下面语句,只有由一个前台线程执行时,才会显示出来
private static void T1Star()
{
Console.WriteLine("Return from T1 Thread");
}
线程池
由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成
内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。
线程池维护一个请求队列,线程池的代码从队列提取任务,
然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,
这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。
线程池线程默认为后台线程(IsBackground)。
static void Main(string[] args)
{
//将工作项加入到线程池队列中,这里可以传递一个线程参数
ThreadPool.QueueUserWorkItem(TestMethod, "Hello");
Console.ReadKey();
}
public static void TestMethod(object data)
{
string datastr = data as string;
Console.WriteLine(datastr);
}
1、进程与线程:进程作为操作系统执行程序的基本单位,
拥有应用程序的资源,进程包含线程,进程的资源被线程共享,
线程不拥有资源。
2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。
当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,
所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。
4、阻塞线程:Join,阻塞调用线程,直到该线程终止。
5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,
终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException
异常让线程终止,通过捕获异常可以继续执行。
6、线程优先级:AboveNormal BelowNormal Highest Lowest Normal,
默认为Normal。
static void Main(string[] args)
{
object o = "HelloWorld";
// 创建一个新线程(默认为前台线程)
Thread t1 = new Thread(new ThreadStart(T1Star));
Thread t2 = new Thread(new ParameterizedThreadStart(T2Star));
// 使线程成为一个后台线程
t1.IsBackground = true;
t2.IsBackground = true;
// 通过Start方法启动线程
t1.Start();
t2.Start(o);
Console.ReadKey();
}
private static void T2Star(object obj)
{
Console.WriteLine("1" + obj);
}
// 下面语句,只有由一个前台线程执行时,才会显示出来
private static void T1Star()
{
Console.WriteLine("Return from T1 Thread");
}
线程池
由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成
内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。
线程池维护一个请求队列,线程池的代码从队列提取任务,
然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,
这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。
线程池线程默认为后台线程(IsBackground)。
static void Main(string[] args)
{
//将工作项加入到线程池队列中,这里可以传递一个线程参数
ThreadPool.QueueUserWorkItem(TestMethod, "Hello");
Console.ReadKey();
}
public static void TestMethod(object data)
{
string datastr = data as string;
Console.WriteLine(datastr);
}