我正在阅读一些线程基础知识,在msdn网站上我找到了这段代码。
// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);
以下是该页面的链接:http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx。
为什么主线程睡眠时间为1毫秒?如果主线程持续运行,辅助线程是否会启动其任务?或者是一个需要1毫秒的任务的例子?如果任务一般需要5秒才能完成,主线程应该睡眠5000毫秒?
如果这仅仅是关于CPU使用情况,则类似Question about Thread.Sleep。
任何意见都将不胜感激。
感谢。
答案 0 :(得分:7)
该代码中的1
并不特别;因为事情不是那么精确,所以总是总是最终睡眠时间更长,并且放弃你的时间片并不等于你得到它时OS的任何保证。
Thread.Sleep()
中时间参数的目的是,你的线程将为至少大致产生这段时间。
因此代码只是明确地放弃了它的时间段。一般来说,不需要这样的代码,因为操作系统会为你管理你的线程,抢先中断它们以便在其他线程上工作。
这种代码通常用于"线程示例",其中作者想要强制某些人为事件来证明某些竞争条件等(在您的示例中似乎是这种情况)
正如Jon Hanna对同一问题的回答所指出的那样,Sleep(0)
和Sleep(1)
(或任何其他非零数字)之间存在微妙但重要的区别,并且作为ChrisF在某些线程情况下,这可能很重要。
这两个都涉及线程优先级;线程可以被赋予更高/更低的优先级,使得只要存在具有任何工作要做的更高优先级线程,优先级较低的线程将永远执行。在这种情况下,可能需要Sleep(1)
... 然而 ...
低优先级线程也受其他进程在同一系统上执行的操作的影响;因此,虽然您的进程可能没有运行更高优先级的线程,但如果其他任何线程运行,您的进程仍然无法运行。
这不是通常你需要担心的事情;默认优先级是“正常”'优先级,在大多数情况下,你不应该改变它。提高或降低它有很多含义。
答案 1 :(得分:4)
Thread.Sleep(0)
将放弃线程的其余时间片。
Thread.Sleep(1)
(或任何其他值,但1是具有此效果的最低值)将无条件地放弃线程的其余时间片。如果它想确保即使具有较低优先级的线程都有机会运行(并且这样的线程可能正在阻止该线程,它必须这样做),那么它就是那个。
http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983-4102-9233-ca54b8f3d1a1.aspx对此有更多了解。
答案 2 :(得分:2)
如果主线程根本没有休眠,那么其他线程将根本无法运行。
插入Sleep
任何长度允许其他线程一些处理时间。使用较小的值(在这种情况下为1毫秒)意味着主线程似乎没有锁定。您可以使用Sleep(0)
,但正如Jon Hanna所指出的那样,Sleep(1)
具有不同的含义(或者实际上是任何正值),因为它只允许具有相同优先级的线程运行。
如果任务需要5秒钟,那么主线程将会睡眠总共5,000毫秒,但会延长一段时间。
答案 3 :(得分:0)
这只是为了示例 - 他们希望确保工作线程有机会在主线程杀死它之前至少打印一次“工作线程:工作......”。
正如安德鲁暗示的那样,这在示例中非常重要,特别是因为如果您在单处理器计算机上运行,主线程可能不会放弃处理器,在有机会迭代一次之前终止后台线程。
答案 4 :(得分:0)
我今天注意到有趣的事情。中断线程会引发ThreadInterruptedException
。我试图抓住异常,但由于某种原因不能。我的同事建议我在catch语句之前添加Thread.Sleep(1)
,这样我就能抓住ThreadInterruptedException
。
// Start the listener
tcpListener_ = new TcpListener(ipAddress[0], int.Parse(portNumber_));
tcpListener_.Start();
try
{
// Wait for client connection
while (true)
{
// Wait for the new connection from the client
if (tcpListener_.Pending())
{
socket_ = tcpListener_.AcceptSocket();
changeState(InstrumentState.Connected);
readSocket();
}
Thread.Sleep(1);
}
}
catch (ThreadInterruptedException) { }
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Contineo", MessageBoxButtons.OK, MessageBoxIcon.Error);
Console.WriteLine(ex.StackTrace);
}
其他一些课......
if (instrumentThread_ != null)
{
instrumentThread_.Interrupt();
instrumentThread_ = null;
}