zoukankan      html  css  js  c++  java
  • Thread系列之Thread.Sleep(0)

    • 摘要:Thread.Sleep(0) MSDN上的解释是挂起此线程能使其他等待线程执行。这样的解释容易导致误解,我们可以这样理解,其实是让当前线程挂起,使得其他线程可以和当前线程再次的抢占Cpu资源。

    线程这一概念,可以理解成进程中的一个小单元。这个单元是一个独立的执行单元,但是与进程中的其他线程共享进程中的内存单元。

    由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线程交替执行。

    Thread.Sleep() 本身的含义是当前线程挂起一定时间。

    Thread.Sleep(0) MSDN上的解释是挂起此线程能使其他等待线程执行。这样的解释容易导致误解,我们可以这样理解,其实是让当前线程挂起,使得其他线程可以和当前线程再次的抢占Cpu资源。

    代码示例:

    代码
    staticvoid Main(string[] args)
    {
    Console.WriteLine(
    "Now main thread begin");
    Program p
    =new Program();
    Thread t
    =new Thread(new ThreadStart(p.ThreadProc));
    t.Start();
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "Main Thread:{0}",i);
    Thread.Sleep(
    0);//这个的意思只不过是让当前线程停顿一下,使得其他线程和他再次重新抢占资源
    }
    Console.Read();
    }
    void ThreadProc()
    {
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "ThreadProc:{0}",i);
    }
    }
    staticvoid Main(string[] args)
    {
    Console.WriteLine(
    "Now main thread begin");
    Program p
    =new Program();
    Thread t
    =new Thread(new ThreadStart(p.ThreadProc));
    t.Start();
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "Main Thread:{0}",i);
    Thread.Sleep(
    0);//这个的意思只不过是让当前线程停顿一下,使得其他线程和他再次重新抢占资源
    }
    Console.Read();
    }
    void ThreadProc()
    {
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "ThreadProc:{0}",i);
    }
    }
    static
    void Main(string[] args)
    {
    Console.WriteLine(
    "Now main thread begin");
    Program p
    =new Program();
    Thread t
    =new Thread(new ThreadStart(p.ThreadProc));
    t.Start();
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "Main Thread:{0}",i);
    Thread.Sleep(
    0);//这个的意思只不过是让当前线程停顿一下,使得其他线程和他再次重新抢占资源
    }
    Console.Read();
    }
    void ThreadProc()
    {
    for (int i =0; i <10; i++)
    {
    Console.WriteLine(
    "ThreadProc:{0}",i);
    }
    }

    执行结果:

    可以看到 当主线程执行了一次循环时,Sleep(0)了一下,使得资源重新在两个线程中分配了一下。另一个线程抢占到资源并执行。

    再执行一下,看下结果:

    可以看到 这次重新分配资源时,先是主线程抢到了资源执行一段时间,之后是另一个线程执行。

    从执行结果可以看出,Thread.Sleep(0) 的真正作用,同时也可以看出多线程之间是交替执行的。

  • 相关阅读:
    解决PyQt5在安装后无法找到Designer.exe问题,两个位置可供参考
    观察者模式
    策略模式
    模板方法模式(下)
    学过的技术容易忘,怎么办?
    Mysql主从配置
    Springboot处理CORS跨域请求
    SpringBoot学习2之注解简单配置Springboot+MyBatis
    Confluence7.4安装并破解汉化教程
    mysql json类型
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2854460.html
Copyright © 2011-2022 走看看