首先来看看如何创建线程:
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
Thread t1 = new Thread(() =>
{
Thread.Sleep(1000);
Thread t = Thread.CurrentThread;
Console.WriteLine("Name: " + t.Name);
Console.WriteLine("ManagedThreadId: " + t.ManagedThreadId);
Console.WriteLine("State: " + t.ThreadState);
Console.WriteLine("Priority: " + t.Priority);
Console.WriteLine("IsBackground: " + t.IsBackground);
Console.WriteLine("IsThreadPoolThread: " + t.IsThreadPoolThread);
})
{
Name = "Thread1",
Priority = ThreadPriority.Highest
};
t1.Start();
Console.WriteLine(Process.GetCurrentProcess().Threads.Count);
我们在Thread的构造方法中传入一个Lambda表达式,对应ThreadStart委托(无参void返回值的方法) 来构造一个线程任务。这段程序中有几个注意点:
1)从输出结果中可以看到,当前程序启动后就3三个线程,新开线程后显示为4个线程,在线程方法中 休眠了一秒,防止主线程执行完次线程就过早结束了。
2)我们可以为线程设置一个名字,方便调试。我们也可以设置线程的优先级,这个在之后会有进一步 介绍。
3)第7行,托管线程的唯一标识符,微软建议使用托管线程的Id而不是操作系统中线程的Id来跟踪线 程。
4)第10行代码输出了当前线程不是后台线程,也就是是前台线程,这是默认值。进程会等待前台线程 结束结束,而如果是后台线程的话,所有前台线程结束后后台线程自动终止。对于Windows GUI应用程序 来说,使用后台线程很可能发生诡异现象,也就是在程序从任务管理器的应用程序一栏中消失后其进程还 在,只能通过手动终止进程来释放内存。
5)第11行代码表明这个线程不是由线程池创建的,有关线程池见后文的介绍。
计算(二)线程基本知识-java 多线程并行执行">
那么我们再来看看如何为线程传入参数,一种方式是使用匹配ParameterizedThreadStart委托 (object参数void返回值)的方法:
new Thread((date) => Console.WriteLine(((DateTime)date).ToString())).Start (DateTime.Now);