线程问题:Interrupt可以唤醒sleep的线程吗?

JZ_7975 2012-11-04 10:05:59
C#参考手册有说,当线程进入睡眠时,它就进入WaitSeepJoin状态。如果线程处于睡眠状态,
在达到指定的睡眠时间之前唤醒线程的唯一方法是使用Interrupt()方法。 我就参照写了一
个例子如下:


static Thread t1;
public static void Main()
{
Console.WriteLine("Begin...");
t1 = new Thread(new ThreadStart(Sleep10));
t1.Start();

Thread t2 = new Thread(new ThreadStart(WakeUpT1));
t2.Start();

Console.WriteLine("End...");
Console.ReadLine();
}

/// <summary>
/// 睡眠十秒钟
/// </summary>
static void Sleep10()
{
Thread.Sleep(10000);
Console.WriteLine("10秒后才执行此语句");
}

/// <summary>
/// 中断线程
/// </summary>
static void WakeUpT1()
{
if (t1.ThreadState == System.Threading.ThreadState.WaitSleepJoin)
{
Console.WriteLine("线程1强制中断");
t1.Interrupt();
}
}

但是程序运行后报异常:ThreadInterruptedException

把异常输入msdn中,它说:调用 Interrupt 时,如果一个线程处于WaitSleepJoin 状态,
则将导致在目标线程中引发 ThreadInterruptedException

这2个说的不是矛盾吗?如果线程处于sleep时,改如何及时唤醒呢?
...全文
394 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
brainpoint 2014-10-29
  • 打赏
  • 举报
回复
catch异常, 当成没有发生过; 其实也可以使用条件变量来模拟sleep
JZ_7975 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 gomoku 的回复:
这里的唤醒就是'在目标线程引发 ThreadInterruptedException'。 目标线程要处理 ThreadInterruptedException异常。
这个不是很明白,如果唤醒就是引发ThreadInterruptedException异常 那还要Interrupt有什么用呢?我不唤醒他不就是了,也就没有什么异常
gomoku 2012-11-05
  • 打赏
  • 举报
回复
这里的唤醒就是'在目标线程引发 ThreadInterruptedException'。 目标线程处理 ThreadInterruptedException异常。
Hauk 2012-11-04
  • 打赏
  • 举报
回复
Interrupt 是用来中断处于 WaitSleepJoin 线程状态的线程并引发ThreadInterruptedException异常,如果该线程一直未阻塞,则一直都不会引发该异常。 还是相信MSDN吧。 其他资料难免会有错误或不准确的地方。其实MSDN有时候都有一些错误。实际效果才是王道。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧