.NET 多线程

77 阅读1分钟

线程启动

无参形式

using System.Diagnostics;

internal class Program
{

    public static void ThreadProc()
    {
        for(int i = 0; i < 10; i++)
        {
            Console.WriteLine("这是子线程:"+i );
            Thread.Sleep(0);
        }
    }
    private static void Main(string[] args)
    {
        new Thread(ThreadProc).Start();

        for(int i = 0; i < 4; i++)
        {
            Console.WriteLine("这是主线程:"+i);
            Thread.Sleep(0);
        }
    }
}

image.png

有参形式

两种传参形式

new Thread(new ParameterizedThreadStart(ThreadProc)).Start("go go go");

new Thread(ThreadProc).Start("stop stop stop");

using System.Diagnostics;

internal class Program
{

    public static void ThreadProc(object str)
    {
        for(int i = 0; i < 10; i++)
        {
            Console.WriteLine("这是子线程:"+i+",这是父线程传入的参数:"+str );
            Thread.Sleep(0);
        }
    }
    private static void Main(string[] args)
    {
        new Thread(new ParameterizedThreadStart(ThreadProc)).Start("go go go");
        new Thread(ThreadProc).Start("stop stop stop");


        for(int i = 0; i < 4; i++)
        {
            Console.WriteLine("这是主线程:"+i);
            Thread.Sleep(0);
        }
    }
}

image.png

线程终止

using System.Diagnostics;

internal class Program
{

    public static void ThreadProc(object str)
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("这是子线程:" + i + ",这是父线程传入的参数:" + str);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    private static void Main(string[] args)
    {
        Thread thread = new Thread(ThreadProc);
        thread.Start("go go go ");

        for(int i = 0; i < 4; i++)
        {
            if (i == 3)
            {
                Console.WriteLine("终止子线程");
                thread.Interrupt();
            }
            Console.WriteLine("这是主线程:"+i);
   
        }
    }
}

image.png

Lock 块

using System.Diagnostics;

internal class Program
{
    private static object lockToken = new object();

    public static void thread(object str)
    {
        lock(lockToken)
        {
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine($"现在是线程{str}的第{i+1}次运行");
            }
        }
    }
    private static void Main(string[] args)
    {
        Thread a = new Thread(thread);
        a.Start("a");


        Thread b = new Thread(thread);
        b.Start("b");


    }
}

image.png

Monitor

using System.Diagnostics;

internal class Program
{
    private static object lockToken = new object();

    public static void thread(object str)
    {
        Monitor.Enter(lockToken);
        //lock(lockToken)
        {
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine($"现在是线程{str}的第{i+1}次运行");
            }
        }
        Monitor.Exit(lockToken);
    }
    private static void Main(string[] args)
    {
        Thread a = new Thread(thread);
        a.Start("a");


        Thread b = new Thread(thread);
        b.Start("b");


    }
}

image.png

Mutex

using System.Diagnostics;

internal class Program
{
    static Mutex mutex = new Mutex();

    public static void thread(object str)
    {
        mutex.WaitOne();

        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"现在是线程{str}的第{i+1}次运行");
        }
        mutex.ReleaseMutex();
    }
    private static void Main(string[] args)
    {
        Thread a = new Thread(thread);
        a.Start("a");

        Thread b = new Thread(thread);
        b.Start("b");

    }
}

image.png