C# 线程简单使用、多线程同步介绍

 

创建一个线程

  1. 引用命名空间 System.Threading
  2. 实例化一个Thread类,需要传进去一个函数。
  3. 调用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 

 

posted on 2022-12-02 16:22  呆子园  阅读(88)  评论(0)    收藏  举报

导航