如果线程已经完成,Thread.Join将返回我们。我们可以使用ThreadState确定相同的内容。那么Thread.Join()和Thread.ThreadState之间有什么区别?
我们可以互换使用吗?
答案 0 :(得分:14)
加入和手动查看ThreadState
之间的区别是Join
是阻止操作。在达到超时或目标Thread
完成之前,该函数不会返回。检查ThreadState
更像是一个窥视操作。
答案 1 :(得分:6)
Thread.join等待线程完成。 ThreadState只是为您提供线程的快照,并且无需等待即可返回。还有一个Thread.join的变种,需要一些时间等待。 ThreadState和Join非常不同,我认为两者都不能互换使用。
尝试进行测试,在具有无限循环的线程上进行两次调用。
答案 2 :(得分:3)
当你调用Thread.Join()
时,它会阻塞调用线程,直到完成了Join方法的线程。如果它被中止或成功完成,则后面的Join()将不会阻止调用线程。这允许您拥有10个工作线程和一个主线程,在完成所有10个线程后必须运行该操作。所以你可以在第一个线程上调用Join()。该调用将阻塞主线程,直到第一个工作线程完成。之后,您可以在第二个线程上调用Join(),依此类推,直到进入第10个线程。当你调用Join()并恢复主线程时,你可以确保所有10个线程都已完成,主线程可以恢复其操作。
例如:
Thread workers[] = new Thread[10];
//*** create and start threads ***
foreach(Thread worker in workers)
{
worker.Join();
}
//All threads are completed, now this operation can continue...
另一方面,Thread.ThreadState
仅返回thread status(Aborted,Running,...)而不影响调用线程的状态(而不是将调用线程置于WaitSleepJoin状态的Join)。所以这只是用于检查线程发生的事情,以便您可以采取某种行动,或者您想要实现自己的加入机制,等等...
答案 3 :(得分:0)
Thread.Join将阻止调用线程