C# 线程简单使用、多线程同步介绍
创建一个线程
- 引用命名空间 System.Threading
- 实例化一个Thread类,需要传进去一个函数。
- 调用Start方法。
1 static void Main(string[] args) 2 { 3 //不带参数 4 Thread thread = new Thread(new ThreadStart(PrintNum)); 5 thread.Start(); 6 //带参数 7 Thread thread1 = new Thread(new ParameterizedThreadStart(PrintNum)); 8 thread1.Start(90); 9 } 10 11 private static void PrintNum() { 12 for (int i = 0; i < 1000; i++) 13 { 14 Console.WriteLine(i); 15 } 16 } 17 private static void PrintNum(object para) { 18 int num = (int)para; 19 for (int i = 0; i < num; i++) 20 { 21 Console.WriteLine("_" + i); 22 } 23 }
线程常用属性讲解
Thread官网API地址 官网的讲解比较详细,如果有需要建议去官网查。在这里讲解其中若干个。
- Name 线程的名称,可以手动设定。
- IsBackground 是否为后台线程。后台线程会在主线程结束后自动退出,不管是否执行完毕。
- ManagedThreadId 线程的唯一ID
线程常用方法讲解
- Sleep(Int32) 让当前线程休眠,单位毫秒。
示例代码static void Main(string[] args) { Thread thread = new Thread(SleepTest); thread.Start(); Console.WriteLine("主线程休眠1秒"); Thread.Sleep(1000); Console.WriteLine("thread:"+thread.ThreadState); Console.WriteLine("主线程结束"); } private static void SleepTest() { Thread curThread = Thread.CurrentThread; Console.WriteLine("thread:"+curThread.ThreadState); Console.WriteLine("让当前线程休眠2秒"); Thread.Sleep(2000); Console.WriteLine("thread结束"); }
- Join() Join(Int32) 不带参,当前线程等待另外一个线程执行完再执行。带参,如果另外一个线程还没有执行完并超过了传递的时间,则当前线程继续执行。
示例代码static void Main(string[] args) { Thread thread = new Thread(JoinTest); thread.Start(); Thread curThread = Thread.CurrentThread; thread.Join(); Console.WriteLine("主线程执行完毕"); } private static void JoinTest() { Console.WriteLine("thread 开始执行"); Thread.Sleep(5000); Console.WriteLine("thread 执行完毕"); }
多线程同步相关类
- Mutex 互斥锁,当多个线程执行的时候,只能有一个线程拥有它,当它被释放后,其他线程才能使用。
- AutoResetEvent 每调用一次WaitOne,都相当于加了一层锁,需要调用一次Set后才能解锁,然后继续执行。如果初始化参数传true,则第一次调用WaitOne不会加锁。
- ManualResetEvent 跟上面的AutoResetEvent类似,不同的是当调用Set的时候会一次解开所有锁,并且下次使用WaitOne之前必须先调用Reset,否则不起作用。
- WaitHandle 可以同时通过多个所进行控制,主要方法 WaitAll WaitAny
浙公网安备 33010602011771号