Sleep() 和 Wait() 是两个不同的方法,用于控制线程的执行。
Sleep() 方法:
是线程类 Thread 的静态方法,它使当前线程暂停执行一段时间。
Sleep() 方法接受一个参数,表示线程暂停的时间长度,单位是毫秒。
在暂停期间,线程不会释放锁资源。当暂停时间结束后,线程会重新进入就绪状态,等待 CPU 调度执行。
Sleep() 方法可以用于模拟一段时间的延迟操作。
Wait() 方法:
是 Object 类的实例方法,它使当前线程进入等待状态,直到其他线程调用相同对象的 Notify() 或 NotifyAll() 方法唤醒它。
Wait() 方法必须在同步代码块或同步方法中调用,并且会释放锁资源。当线程被唤醒后,它会重新竞争锁资源,并继续执行。
Wait() 方法通常与Notify() 或 NotifyAll() 方法配合使用,用于实现线程间的协作。(Notify:通知)
参考代码:
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static readonly object _locker = new object(); static bool _go; static void Main(string[] args) { new Thread(Work).Start(); //新线程会被阻塞,因为_go == false Console.ReadLine(); //等待用户输入 lock (_locker) { _go = true; //改变阻塞条件 Monitor.Pulse(_locker); //通知等待的队列。 } Thread.Sleep(1000); } static void Work() { lock (_locker) { while (!_go) //只要_go字段是false,就等待。 Monitor.Wait(_locker); //在等待的时候,锁已经被释放了。 } Console.WriteLine("被唤醒了"); } } }
区别:
- Sleep() 是 Thread 线程类的方法,而 Wait() 是 Object 类的方法。
- Seep() 会暂停当前线程的执行一段时间,而 Wait() 会使当前线程进入等待状态。
- Sleep() 不会释放锁资源,而 Wait() 会释放锁资源。
- Sleep() 不需要被其他线程唤醒,而 Wait() 需要被其他线程调用相同对象的 Notify() 或 NotifyAll() 方法唤醒。
需要注意的是,Sleep() 和 Wait() 方法都可能抛出 InterruptedException 异常,需要进行异常处理。