线程问题-主程序线程为什么不执行

xingxingliang 2010-01-30 09:41:21
代码和输出结果如下, 问题是
Child #1 joined.
Child #2 joined.
Child #3 joined.
这三个主程序的语句为什么在最后执行? 当其它线程sleep的时候,主程序还不能执行吗?
为什么? 谢谢!

using System;
using System.Threading;

class MyThread
{
public int count;
public Thread thrd;

public MyThread(string name)
{
count = 0;
thrd = new Thread(run);
thrd.Name = name;
thrd.Start();
}

void run()
{
Console.WriteLine(thrd.Name + " starting.");

do
{
Thread.Sleep(1000);
Console.WriteLine("In " + thrd.Name +
", count is " + count);
count++;
} while (count < 5);

Console.WriteLine(thrd.Name + " terminating.");
}
}

class MainClass
{
public static void Main()
{
Console.WriteLine("Main thread starting.");

MyThread mt1 = new MyThread("Child #1");
MyThread mt2 = new MyThread("Child #2");
MyThread mt3 = new MyThread("Child #3");

mt1.thrd.Join();
Console.WriteLine("Child #1 joined.");

mt2.thrd.Join();
Console.WriteLine("Child #2 joined.");

mt3.thrd.Join();
Console.WriteLine("Child #3 joined.");

Console.WriteLine("Main thread ending.");

Console.ReadLine();
}
}



这是输出结果:
Main thread starting.
Child #1 starting.
Child #2 starting.
Child #3 starting.
In Child #2, count is 0
In Child #1, count is 0
In Child #3, count is 0
In Child #2, count is 1
In Child #1, count is 1
In Child #3, count is 1
In Child #2, count is 2
In Child #1, count is 2
In Child #3, count is 2
In Child #2, count is 3
In Child #1, count is 3
In Child #3, count is 3
In Child #2, count is 4
Child #2 terminating.
In Child #1, count is 4
Child #1 terminating.
In Child #3, count is 4
Child #3 terminating.
Child #1 joined.
Child #2 joined.
Child #3 joined.
Main thread ending.
...全文
172 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingxingliang 2010-02-01
  • 打赏
  • 举报
回复
哦, 他们这个join是对于主线程而言的, 所以主线程要等待他们结束。 犯了一个错误, 我以为只是对于当前线程的join, 实际这个语句的当前线程就是主线程, thanks!!!
Thr21ough 2010-01-30
  • 打赏
  • 举报
回复
up~
michaelnami 2010-01-30
  • 打赏
  • 举报
回复
关系到线程就不是顺序执行了 有一个线程调度机制
ouc_ajax 2010-01-30
  • 打赏
  • 举报
回复
Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。

当子线程sleep的时候父类线程是可以执行的!但是上边你把mt1.thrd.Join(); 以为着子线程先结束后主线程再执行,因此主线程肯定等待mt1执行完成。
luobocheng 2010-01-30
  • 打赏
  • 举报
回复
join 阻塞住主线程的执行了,直到该线程结束,你如果在join函数里加参数
join(0),那么就会按你设想的先执行完下面的
Child #1 joined.
Child #2 joined.
Child #3 joined.
再执行
In Child #2, count is 0
In Child #1, count is 0
In Child #3, count is 0
In Child #2, count is 1
In Child #1, count is 1
In Child #3, count is 1
In Child #2, count is 2
In Child #1, count is 2
In Child #3, count is 2
In Child #2, count is 3
In Child #1, count is 3
In Child #3, count is 3
In Child #2, count is 4
Child #2 terminating.
In Child #1, count is 4
Child #1 terminating.
In Child #3, count is 4
Child #3 terminating.

110,561

社区成员

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

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

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