A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 贡宗新 中级黑马   /  2013-5-21 14:50  /  1540 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;

  6. namespace 一个简单的多线程程序
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             Console.WriteLine("进入主线程工作");
  13.             for (int i = 0; i < 10; i++)
  14.             {
  15.                 //新建了一个thread对象
  16.                 Thread newthread = new Thread(Work);
  17.                 //这里新建线程
  18.                 newthread.Start();
  19.             }

  20.             Console.WriteLine("主线程结束");
  21.             Console.ReadKey();
  22.         }

  23.         private static void Work()
  24.         {
  25.             Console.WriteLine("副线程开始");
  26.             //模拟做了些工作
  27.             Thread.Sleep(1000);
  28.             //sleep(1000)什么意思呢???
  29.             Console.WriteLine("副线程结束");
  30.         }
  31.     }
  32. }
复制代码
为什么主线程结束后,还有两个副线程才刚开始呢,是因为sleep的原因吗,求解多线程两个线程之间的关系,最好能把这个程序的运行状况告诉我。谢谢

QQ截图20130521144811.png (29.01 KB, 下载次数: 0)

QQ截图20130521144811.png

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 shenge321 于 2013-5-21 16:32 编辑

个人观点:Thread.Sleep(1000)放弃了占用CPU一秒,请求不再被分配时间直到给定的时间结束。在这个被放弃的一秒里,其他线程可能会被建立启用。然后被建立的新线程又被放弃占用CPU...............所以,出现开始和结束不匹配的现象。如果它不跟要作用的线程呆一块的话,肯定会出问题的。
还有在该例子里,只是建立多个线程,应该没有主副之分。
  1.         static void Main(string[] args)
  2.         {
  3.             Console.WriteLine("进入线程工作");
  4.             for (int i = 0; i < 10; i++)
  5.             {
  6.                 //新建了一个thread对象
  7.                 Thread newthread = new Thread(Work);
  8.                 //这里新建线程
  9.                 newthread.Start();
  10.                 Thread.Sleep(1000);//sleep(1000)线程休眠一秒。
  11.             }
  12.             Console.WriteLine("所有线程结束");
  13.             Console.ReadKey();
  14.         }

  15.         private static void Work()
  16.         {
  17.             Console.WriteLine("线程开始");
  18.             //模拟做了些工作
  19.             Console.WriteLine("线程结束");
  20.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
shenge321 发表于 2013-5-21 16:28
个人观点:Thread.Sleep(1000)放弃了占用CPU一秒,请求不再被分配时间直到给定的时间结束。在这个被放弃的 ...

谢谢,主副线程只是些的时候来区分进程的切换,所以还是谢谢提醒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马