base hilo se sabe que será (a)

Desde el principio de este artículo, voy a utilizar dos artículos explican los conceptos básicos de las discusiones, este artículo implica la creación de hilos , hilo de espera , hilo suspendido , la terminación de subprocesos y el estado de detección de hilo contenido relacionado. Este artículo y el siguiente artículo es la base para la fundación del tema, así que van a utilizar el lenguaje de código de ejemplo y sencillo de explicar, con el fin de ser capaz de seguir su otro hilo sólo para sentar una sólida Después de leer el artículo, fundación. El aprendizaje de este artículo es necesario tener el lenguaje C # básica y cualquier versión de Microsoft Visual Studio 2015 y anteriormente.
El hilo de llamada, es el sistema operativo utiliza alguna manera la unidad de cálculo se divide en un gran número de proceso virtual, a continuación, dar estos procesos virtuales cierta potencia de cálculo. Cabe señalar que, desde la creación y uso es un proceso del sistema operativo multiproceso consume una gran cantidad de recursos, por lo que cuando no hay más que un solo núcleo de multiproceso procesador causa el sistema operativo para gestionar estos hilos están ocupados, y por lo tanto no se puede ejecutar el programa y, a veces, incluso el propio sistema operativo no funcionará correctamente (incluso si el sistema operativo más alto de acceso prioritario al procesador, que tendrá que enfrentarse a este problema). Por lo tanto, los procesadores convencionales actuales son procesadores de múltiples núcleos y potencia de cálculo es bastante alto, pero no podemos ignorar el desarrollo de hardware y software de mejora, la corriente actual de lenguajes de desarrollo soporta multithreading. Ado Ahora comenzamos la primera base después del hilo.

En primer lugar, crear un hilo

Formas de crear un hilo es muy sencillo, sólo tiene que crear instancias de rosca a, la forma en que nos gustaría correr en el nuevo hilo en la instancia del proceso se pasa al hilo, y luego llamar al inicio método para ejecutar el nuevo hilo. Echemos un vistazo al código que crea hilos.

using System;
using System.Threading;

namespace CreateThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(PrintNumber);
            thread.Start();
            PrintNumber();
            Console.Read();
        }
        static void PrintNumber()
        {
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine($"第 {i + 1} 个数字是 {i}");
            }
        }
    }
}

La segunda línea de código anterior el uso el uso de hilo espacio de nombres introdujo en el System.Threading , después creamos un método estático en el Programa de clase PrintNumber , en este método se escribe un bucle, imprimir a dos en el ciclo de la consola diez dígitos. Luego en el método Main crea una instancia de rosca, y delante del método estático, se define el PrintNumber pasa como parámetro a la rosca, a destacar aquí es que pasamos a la rosca es tipos ThreadStart de parámetros, ThreadStart un delegado representa debe método realizado en un hilo, este delegado al constructor hilo, hasta que el método llamado hilo.start antes de llamar a este método. Por último, llamamos al método Start Tema a correr el hilo de nueva creación. líneas duodécimo de código que llaman al método PrintNumber de la manera habitual, a continuación, con el fin de hacer la comparación. A continuación, se corre el código, verá dos llamadas a métodos PrintNumber de la extracción de contenido será visualización cruzado aleatorio.

Mxkaw9.png

Propina:

  1. Cuando creamos una instancia hilo, ThreadStart o comisión instancia ParameterizedThreadStart serán pasados ​​al constructor. Tan sólo hay que especificar el método de diferentes hilos que se ejecutan nombre, compilador de C # crear estos objetos en el fondo.
  2. Rosca ubicada en el proceso, un proceso que contiene al menos un hilo, y siempre hay un proceso de un hilo principal en una misión.

Segundo, el hilo espera

Cuando las necesidades del programa para utilizar los resultados de otro hilo que tenemos que utilizar Únete método, el papel de la unión método es para bloquear el hilo llamando a plazo, por lo que el subproceso de llamada está esperando el subproceso de llamada (hilos niño) que se ejecuta después de que se completó la carrera. Únete método es simple conexión a un sub-hilo de la llamada al método actual hasta que se termine el hilo hijo. Podemos utilizar este método para sincronizar los pasos entre los dos hilos. Nos fijamos en el uso de los métodos siguientes a través del código para ver Conectar.

using System;
using System.Threading;

namespace ThreadWait
{
    class Program
    {
        static int count = 0;
        static void Main(string[] args)
        {
            Thread thread = new Thread(PrintNumber);
            thread.Start();
            thread.Join();
            PrintNumber();
            Console.WriteLine(count);
            Console.Read();
        }
        static void PrintNumber()
        {
            for (int i = 0; i < 20; i++)
            {
               count+=i;
            }
        }
    }
}

La línea 13 en el código anterior que llamamos el método de unión para que la espera del hilo principal, porque tenemos que utilizar el hilo de rosca resultados de subproceso de ejecución cuando el hilo emperador acabada continuará funcionando, los principales llamadas de rosca en la forma habitual método PrintNumber, cuando el valor de recuento no se inicializa PrintNumber 0, sino más bien a través de un hilo de resultado de la ejecución de la rosca 190, a través de la recalcula PrintNumber, el resultado es la salida final 380. Si no utilizamos el método de incorporación, la salida no se conoce.

MxeWGR.png

En tercer lugar, el hilo se suspende

Por ejemplo, cuando tenemos que dejar de servicio de Windows o Terminar proceso (no se limita a estos dos casos), servicio o proceso en respuesta a la presencia de la lógica de salida, entonces no podemos seguimiento inmediato sobre la aplicación del código principal del programa, es necesario esperar para el servicio o proceso completamente fuera de la parte trasera código subsiguiente se puede realizar. Pero también porque el servicio está detenido o no es el procedimiento actual proceso de matar el proceso, no somos capaces de hacer que el hilo principal a través del Ingreso espera de método, podemos utilizar el sueño método para obtener el hilo principal de dejar de correr después de un período de tiempo código posterior (este método no es la mejor manera, sólo lo utilizará para explicar). método Sleep ha dos sobrecargado, una unidad de milisegundos se pasa parámetro de tipo int, parámetros, representa un largo hilo suspendido. Otro tipo de sobrecarga se pasa parámetro TimeSpan, parámetro representa la cantidad de hilo suspendido tiempo. El código siguiente es para simular la pausa de muertes después de la ciudad cayó en un cierto período de tiempo.

using System;
using System.Diagnostics;
using System.Threading;

namespace ThreadPause
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(KillProcess);
            thread.Start();
            Console.ReadLine();
        }

        static void KillProcess()
        {
            Process process = Process.GetProcessesByName("notepad")[0];
            process.Kill();
            Thread.Sleep(20);
            if (Process.GetProcessesByName("notepad").Length == 0)
            {
                Console.WriteLine("已被Kill");
            }
        }
    }
}

Los anteriores son sólo simulaciones, para evitar esto es realmente complicado proyecto. Cabe señalar que a veces vamos a ver ese texto en el código Thread.Sleep(0), este enfoque no significa pausa 0 ms, el significado fundamental cuando el valor del parámetro es 0, entonces el hilo voluntad resto de su porción de tiempo para dejar a cualquiera que esté dispuesto a correr, con el mismo hilo de prioridad. Si no hay otro listo para correr, con el mismo subproceso de prioridad, no va a suspender la ejecución del subproceso actual.

Propina:

  1. Cuando el hilo está inactivo, se ocupa tan poco tiempo de CPU.

En cuarto lugar, la terminación del hilo

termina de rosca en el desarrollo real con un relativamente pequeño, sólo para uso en circunstancias muy especiales, de acuerdo a mi experiencia en el punto de vista del desarrollo del proyecto, no he encontrado una necesidad situación para el uso de hilo termina, vamos a primera vista código.

using System;
using System.Threading;

namespace ThreadStop
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(PrintNumber);
            thread.Start();
            Thread.Sleep(200);
            thread.Abort();
            Console.Read();
        }
        static void PrintNumber()
        {
            for (int i = 0; i < 1000; i++)
            {
                Console.WriteLine($"第 {i + 1} 个数字是 {i}");
            }
        }

    }
}

El código comienza a funcionar después de llamar a 200 milisegundos hilo Abortar método para terminar el hilo a seguir, podemos ver el lazo de salida con rosca no terminado completamente de la siguiente figura, terminamos porque el hilo se pierde. Abort método es equivalente a llamar hilo en un ThreadAbortException métodos causa el hilo para ser terminado. Pero aquí hay que recordarle que el procedimiento para hacerlo es muy peligroso, ya que introduce una excepción a esta excepción puede destruir fácilmente su aplicación. Y debe terminarse por el procesamiento de hilo y llaman a esto una Thread.ResetAbort manera de negarse a ser terminado. Voy a explicar acerca de la manera de resolver este problema en un artículo posterior.

QppCh6.png

En quinto lugar, se detecta el estado hilo

detección del estado de rosca en muchos casos se utilizará, el estado actual de la rosca en C # hay diez, estos estados diez en la tabla de abajo. Comúnmente usada estado había Correr , el sin comenzar , Detenido y WaitSleepJoin .

estado explicación
Corriendo El hilo ha sido iniciado
StopRequested Estamos solicitando paradas de hilo
SuspendRequested Está solicitando hilo se suspende
Antecedentes Hilo se ejecuta como un subproceso de fondo
sin comenzar Hilo no se inicia
Detenido El hilo se ha detenido
WaitSleepJoin El hilo se bloquea
Suspendido hilo suspendido
AbortRequested El hilo se detiene
Abortado El hilo ha sido terminado, pero el Estado no se detiene

El primero es el estado de la rosca sin comenzar porque esta vez el hilo no se inicia, cuando el Estado se convierte en los inicios de rosca Correr , cuando llamamos al método del sueño o unirse estado se convierte en el hilo WaitSleepJoin . Terminar el hilo después de estado de hilo es abortada , pero puede haber AbortRequested . Cuando el hilo es el estado final será detenido .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ThreadState
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(PrintNumber);
            Console.WriteLine("线程状态:" + thread.ThreadState);
            thread.Start();
            for (int i = 0; i < 20; i++)
            {
                Console.WriteLine("线程状态:" + thread.ThreadState);
            }
        }

        static void PrintNumber()
        {
            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(2000);
            }
        }
    }
}

QpC9SK.png

En sexto lugar, el trabajo

  1. Nuevos múltiples hilos, respectivamente, terminación y suspensión de varios procesos, y luego ver su estado.

Siete, código fuente descarga

Descargar código fuente actual:

  1. Dirección a:
    https://github.com/Thomas-Zhu/Multithreading/tree/master/no1/NoOne
  2. Localización de: https://gitee.com/bugback_admin/Multithreading/tree/master/no1/NoOne
Publicados 204 artículos originales · ganado elogios 101 · Vistas de 350.000 +

Supongo que te gusta

Origin blog.csdn.net/gangzhucoll/article/details/103267544
Recomendado
Clasificación