多线程概念:会在所有子线程执行完毕之前执行返回语句
本文关键字:执行 语句 返回 线程 多线程 | 更新日期: 2023-09-27 18:06:12
我有一个最近一直困扰我的问题。请看下面的c#代码示例。
public void threading()
{
for(int count =0; count< 4; count++)
{
Thread childThread = new Thread(childThread);
childThread.start()
}
return;
}
public void childThread()
{
// Do alot of work
}
因为在threading
方法的循环之后有一个返回语句,threading
会在所有子线程完成执行之前执行返回语句吗?我在某个地方读到线程与fork不同,因为它们不创建单独的内存区域,所以死线程最终会在哪里?
将在所有子线程之前执行返回语句线程执行完毕?
也许是的。也许不是。这完全取决于你的childThread
方法需要多长时间来执行。如果你的childThread
方法真的花费更少的时间,那么在threading
方法中执行返回语句之前,所有四个线程都可能完成。
另一方面,如果它需要很长时间,那么即使在threading
方法完成执行或返回Main
之后,线程也可以继续异步执行。
你需要知道的另一件事:
默认情况下,他们创建的所有线程都是后台线程。所以只要你的进程还活着,它们就会存在。如果你的主GUI线程即将结束,那么这四个线程也将被终止。所以至少有一个前台线程必须是活的,你的四个线程才能继续执行childThread
方法运行到完成。
就内存而言-创建的每个线程都有自己的堆栈内存区域,但它们共享公共堆内存。此外,无论是堆栈内存还是线程的堆内存,它肯定位于进程自己的地址空间的外围。
如果你想强制所有的子线程在你的threading
方法返回之前终止,你可以在线程上使用Join
方法,例如
public void Threading()
{
List<Thread> threads = new List<Thread>();
// start all threads
for(int count =0; count< 4; count++)
{
Thread childThread = new Thread(ChildThread);
childThread.start();
threads.Add(thread);
}
// block until all threads have terminated
for(int count =0; count< 4; count++)
{
threads[count].Join();
}
// won't return until all threads have terminated
return;
}
public void ChildThread()
{
// Do alot of work
}