Thread.join疑惑

appel8103 2007-03-01 02:29:09
这段代码的结果将是如何?

static void Main()
{
Test t = new Test();
t.ThreadList();
}


public void ThreadList()
{
Work w1 = new Work();
Thread Thread1 = new Thread(new ThreadStart(w1.DoWork1));
Thread Thread2 = new Thread(new ThreadStart(w1.DoWork2));
Thread Thread3 = new Thread(new ThreadStart(w1.DoWork3));

List<Thread> thdlst = new List<Thread>();
thdlst.Add(Thread1);
thdlst.Add(Thread2);
thdlst.Add(Thread3);

foreach (Thread thd in thdlst)
{
thd.Start();
}
foreach (Thread thd in thdlst)
{
thd.Join();
}

}
...全文
2181 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zouqiang122 2007-04-03
  • 打赏
  • 举报
回复
up
曲滨_銘龘鶽 2007-03-29
  • 打赏
  • 举报
回复
[主线程]
|
[=======开始线程=======]
/ | \
[工作线程1][工作线程2] [工作线程n]

在开始线程 Join 工作线程,不要再主线程 join

否则主线程就被阻塞停止了。
如果是windows 程序就和死机一样。

zouqiang122 2007-03-29
  • 打赏
  • 举报
回复
up...
jason_mf 2007-03-02
  • 打赏
  • 举报
回复
另外怎么在线程中传参数
如果DoWork1方法带一个参数,Thread1 定义怎么改
Thread Thread1 = new Thread(new ThreadStart(w1.DoWork1(1)));
===============================
直接传参数是不行的
用 MethodInvoker
appel8103 2007-03-01
  • 打赏
  • 举报
回复
"你需要明白这个方法是阻止调用线程"
thread2 thread3是不是在thd.Start()时候就已经被调用了?后面就没有办法阻止了?

另外怎么在线程中传参数
如果DoWork1方法带一个参数,Thread1 定义怎么改
Thread Thread1 = new Thread(new ThreadStart(w1.DoWork1(1)));
viena 2007-03-01
  • 打赏
  • 举报
回复
你需要明白这个方法是阻止调用线程,
即someThread.Join这一句代码所属的线程,直到someThread终止
viena 2007-03-01
  • 打赏
  • 举报
回复
/*
我希望的运行结果是,同时运行三个线程,一旦某个开始,就只有做完才能起下一个。代码该如何改呢?
*/
那就顺序执行好了,有必要用多线程吗?
viena 2007-03-01
  • 打赏
  • 举报
回复
//把Join记成阻塞当前线程了
Join就是阻塞当前线程(调用方)啊,
只不过当前线程就是主线程而已
appel8103 2007-03-01
  • 打赏
  • 举报
回复
"第一个线程是最慢的,应该是最晚运行完
那么后二个Thread.Join不起任何作用(因为线程已运行完)"
如果第一个线程是最快的,后二个Thread.Join也不起任何作用。

我希望的运行结果是,同时运行三个线程,一旦某个开始,就只有做完才能起下一个。代码该如何改呢?
Red_angelX 2007-03-01
  • 打赏
  • 举报
回复
把Join记成阻塞当前线程了 寒... 这个结果有点依赖于Sleep的时间
diandian82 2007-03-01
  • 打赏
  • 举报
回复
也是有多种可能,因为如果1很长的话,2,3 不用join就已经完了。
Red_angelX 2007-03-01
  • 打赏
  • 举报
回复
I am work 2-0
I am work 3-0
I am work 2-1
I am work 2-2
I am work 1-0
I am work 3-1
I am work 2-3
I am work 3-2
I am work 2-4
I am work 1-1
I am work 3-3



Red_angelX 2007-03-01
  • 打赏
  • 举报
回复
果然是和没用Join一个效果~
Red_angelX 2007-03-01
  • 打赏
  • 举报
回复
foreach (Thread thd in thdlst)
{
thd.Start();
}

每执行一次循环Thread会立即运行吗?
我的理解是循环完成之后Thread才会选择Start的操作
best8625 2007-03-01
  • 打赏
  • 举报
回复
UP...
viena 2007-03-01
  • 打赏
  • 举报
回复
晕,被1楼误导了,应该是和没用Thread.Join一个效果
viena 2007-03-01
  • 打赏
  • 举报
回复
结果应该就是,
和没用thread一个效果
不知道猜得对不对
viena 2007-03-01
  • 打赏
  • 举报
回复
第一个线程是最慢的,应该是最晚运行完
那么后二个Thread.Join不起任何作用(因为线程已运行完)
灰太狼 2007-03-01
  • 打赏
  • 举报
回复
调用第一个Thread.Join后,主线程就被阻塞了
此时三个线程同时运行
第一个线程运行完,主线程激活,会调用第二个Thread.Join
如果第二个线程先运行完,不起作用
第二个线程运行完,主线程激活,会调用第三个Thread.Join
如果第三个线程先运行完,不起作用

解釋的完全正確。
viena 2007-03-01
  • 打赏
  • 举报
回复
一段逻辑混乱,莫名其妙的代码~
加载更多回复(5)

110,561

社区成员

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

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

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