Cómo utilizar la función Thread.Join de C#
Explicación de MSDN: bloquear el hilo de llamada hasta que finalice un hilo. Primero, debemos aclarar algunas cuestiones:
1. Un proceso consta de uno o más subprocesos y puede haber un cierto orden y una relación de exclusión mutua entre los subprocesos. En la programación de subprocesos múltiples, el primer paso es encontrar formas de dividir los subprocesos y reducir la secuencia y las relaciones de exclusión mutua entre subprocesos, para garantizar que la independencia de los subprocesos y su trabajo respectivo no se vea afectado. La idea central de MapReduce de Google es minimizar la secuencia y las relaciones de exclusión mutua entre subprocesos.
2. No importa cómo lo piense, habrá una cierta secuencia y relación de exclusión mutua entre subprocesos. En este caso, se puede utilizar Thread.
3. Durante el proceso de ejecución, un hilo puede llamar a otro hilo. El primero puede denominarse hilo llamante y el segundo se convierte en hilo llamado.
4. Escenarios de uso del método Thread.Join: el subproceso que realiza la llamada se cuelga, espera a que el subproceso llamado complete la ejecución y luego continúa la ejecución.
5. El hilo llamado ejecuta el método Join y le dice al hilo que llama que debe hacer una pausa primero y esperar a que complete la ejecución antes de ejecutarlo nuevamente. Esto asegura una relación secuencial.
6. Considere una situación interesante: llamar a Thread en el hilo actual. Análisis: suponga que el subproceso actual es A, el subproceso que llama es A y el subproceso llamado también es A. Dado que el subproceso que llama A está suspendido, el subproceso llamado A (es decir, el subproceso que llama A) nunca se ejecutará. resultando en un punto muerto.
Bien, después del análisis anterior, echemos un vistazo a los casos de prueba:
Use System
Use System.Collections.Generic
Usar System.Linq;
Usar System.Text;
Usar System.Text;
Usar System.Text;
Usar System.Text
Usar ?System.Threading;
espacio de nombres?Test
{
clase?TestThread
{
privado?static?void?ThreadFuncOne()
{
for(int?WriteLine(Thread.CurrentThread.Name?+? i ?=?" ?ha?terminado");
}
static?void?Main(string[]?args)
{
Subproceso.CurrentThread.Name?=?" ?MainThread";
Subproceso?newThread?=?new?Thread(new?ThreadStart(TestThread.ThreadFuncOne));
newThread.Name?=?"NewThread";
for(int?j?=?0;?j?20;?j++)
{
si?(j?==?10)
{
newThread.Start();
newThread.Join ();
}
else
{
Console.WriteLine(Thread.CurrentThread.Name?+?" j?=?" ? +?j ) ;
}
}
Console.Read();
}
}
}
Los siguientes son los resultados de la prueba:
Conclusión: De la prueba podemos ver claramente que MainThread se bloquea después de llamar a NewThread.Join y se bloquea hasta NewThread p>
Continuar hasta completar la ejecución.